|
|
#-------------------------------------------------------------------------------
|
|
|
# Driver code that the client runs.
|
|
|
#-------------------------------------------------------------------------------
|
|
|
# To run this code start a controller and engines using:
|
|
|
# ipcluster -n 2
|
|
|
# Then run the scripts by doing irunner rmt.ipy or by starting ipython and
|
|
|
# doing run rmt.ipy.
|
|
|
|
|
|
from rmtkernel import *
|
|
|
from IPython.kernel import client
|
|
|
|
|
|
|
|
|
def wignerDistribution(s):
|
|
|
"""Returns (s, rho(s)) for the Wigner GOE distribution."""
|
|
|
return (numpy.pi*s/2.0) * numpy.exp(-numpy.pi*s**2/4.)
|
|
|
|
|
|
|
|
|
def generateWignerData():
|
|
|
s = numpy.linspace(0.0,4.0,400)
|
|
|
rhos = wignerDistribution(s)
|
|
|
return s, rhos
|
|
|
|
|
|
|
|
|
def serialDiffs(num, N):
|
|
|
diffs = ensembleDiffs(num, N)
|
|
|
normalizedDiffs = normalizeDiffs(diffs)
|
|
|
return normalizedDiffs
|
|
|
|
|
|
|
|
|
def parallelDiffs(rc, num, N):
|
|
|
nengines = len(rc.get_ids())
|
|
|
num_per_engine = num/nengines
|
|
|
print "Running with", num_per_engine, "per engine."
|
|
|
rc.push(dict(num_per_engine=num_per_engine, N=N))
|
|
|
rc.execute('diffs = ensembleDiffs(num_per_engine, N)')
|
|
|
# gather blocks always for now
|
|
|
pr = rc.gather('diffs')
|
|
|
return pr.r
|
|
|
|
|
|
|
|
|
# Main code
|
|
|
if __name__ == '__main__':
|
|
|
rc = client.MultiEngineClient()
|
|
|
print "Distributing code to engines..."
|
|
|
r = rc.run('rmtkernel.py')
|
|
|
rc.block = False
|
|
|
|
|
|
# Simulation parameters
|
|
|
nmats = 100
|
|
|
matsize = 30
|
|
|
|
|
|
%timeit -n1 -r1 serialDiffs(nmats,matsize)
|
|
|
%timeit -n1 -r1 parallelDiffs(rc, nmats, matsize)
|
|
|
|
|
|
# Uncomment these to plot the histogram
|
|
|
import pylab
|
|
|
pylab.hist(parallelDiffs(rc,matsize,matsize))
|
|
|
|