##// END OF EJS Templates
Updated the docs for using MPI with IPython.
Updated the docs for using MPI with IPython.

File last commit:

r1338:72652d65
r1778:8a18869b
Show More
multiengine1.ipy
227 lines | 3.7 KiB | text/plain | TextLexer
#-------------------------------------------------------------------------------
# Imports
#-------------------------------------------------------------------------------
import time
import numpy
import IPython.kernel.magic
from IPython.kernel import client
from IPython.kernel.error import *
mec = client.MultiEngineClient()
#-------------------------------------------------------------------------------
# Setup
#-------------------------------------------------------------------------------
mec.reset()
mec.activate()
mec.block = True
mec.get_ids()
n = len(mec)
assert n >= 4, "Not Enough Engines: %i, 4 needed for this script"%n
values = [
10,
1.0,
range(100),
('asdf', 1000),
{'a': 10, 'b': 20}
]
keys = ['a','b','c','d','e']
sequences = [
range(100),
numpy.arange(100)
]
#-------------------------------------------------------------------------------
# Blocking execution
#-------------------------------------------------------------------------------
# Execute
mec.execute('import math')
mec.execute('a = 2.0*math.pi')
mec.execute('print a')
for id in mec.get_ids():
mec.execute('b=%d' % id, targets=id)
mec.execute('print b')
try:
mec.execute('b = 10',targets=-1)
except InvalidEngineID:
print "Caught invalid engine ID OK."
try:
mec.execute('a=5; 1/0')
except CompositeError:
print "Caught 1/0 correctly."
%px print a, b
try:
%px 1/0
except CompositeError:
print "Caught 1/0 correctly."
%autopx
import numpy
a = numpy.random.rand(4,4)
a = a+a.transpose()
print numpy.linalg.eigvals(a)
%autopx
mec.targets = [0,2]
%px a = 5
mec.targets = [1,3]
%px a = 10
mec.targets = 'all'
%px print a
# Push/Pull
mec.push(dict(a=10, b=30, c={'f':range(10)}))
mec.pull(('a', 'b'))
mec.zip_pull(('a', 'b'))
for id in mec.get_ids():
mec.push(dict(a=id), targets=id)
for id in mec.get_ids():
mec.pull('a', targets=id)
mec.pull('a')
mec['a'] = 100
mec['a']
# get_result/reset/keys
mec.get_result()
%result
mec.keys()
mec.reset()
mec.keys()
try:
%result
except CompositeError:
print "Caught IndexError ok."
%px a = 5
mec.get_result(1)
mec.keys()
# Queue management methods
%px import time
prs = [mec.execute('time.sleep(2.0)',block=False) for x in range(5)]
mec.queue_status()
time.sleep(3.0)
mec.clear_queue()
mec.queue_status()
time.sleep(2.0)
mec.queue_status()
mec.barrier(prs)
for pr in prs:
try:
pr.r
except CompositeError:
print "Caught QueueCleared OK."
# scatter/gather
mec.scatter('a', range(10))
mec.gather('a')
mec.scatter('b', numpy.arange(10))
mec.gather('b')
#-------------------------------------------------------------------------------
# Non-Blocking execution
#-------------------------------------------------------------------------------
mec.block = False
# execute
pr1 = mec.execute('a=5')
pr2 = mec.execute('import sets')
mec.barrier((pr1, pr2))
pr1 = mec.execute('1/0')
pr2 = mec.execute('c = sets.Set()')
mec.barrier((pr1, pr2))
try:
pr1.r
except CompositeError:
print "Caught ZeroDivisionError OK."
pr = mec.execute("print 'hi'")
pr.r
pr = mec.execute('1/0')
try:
pr.r
except CompositeError:
print "Caught ZeroDivisionError OK."
# Make sure we can reraise it!
try:
pr.r
except CompositeError:
print "Caught ZeroDivisionError OK."
# push/pull
pr1 = mec.push(dict(a=10))
pr1.get_result()
pr2 = mec.pull('a')
pr2.r
# flush
mec.flush()
pd1 = mec.execute('a=30')
pd2 = mec.pull('a')
mec.flush()
try:
pd1.get_result()
except InvalidDeferredID:
print "PendingResult object was cleared OK."
try:
pd2.get_result()
except InvalidDeferredID:
print "PendingResult object was cleared OK."
# This is a command to make sure the end of the file is happy.
print "The tests are done!"