1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160
|
import sys, os, mpi4py
from mpi4py import MPI
import mpiunittest as unittest
MPI4PYPATH = os.path.abspath(os.path.dirname(mpi4py.__path__[0]))
CHILDSCRIPT = os.path.abspath(
os.path.join(os.path.dirname(__file__), 'spawn_child.py')
)
class BaseTestSpawn(object):
COMM = MPI.COMM_NULL
COMMAND = sys.executable
ARGS = [CHILDSCRIPT, MPI4PYPATH]
MAXPROCS = 1
INFO = MPI.INFO_NULL
ROOT = 0
def testCommSpawn(self):
child = self.COMM.Spawn(self.COMMAND, self.ARGS, self.MAXPROCS,
info=self.INFO, root=self.ROOT)
local_size = child.Get_size()
remote_size = child.Get_remote_size()
child.Barrier()
child.Disconnect()
self.assertEqual(local_size, self.COMM.Get_size())
self.assertEqual(remote_size, self.MAXPROCS)
def testReturnedErrcodes(self):
errcodes = []
child = self.COMM.Spawn(self.COMMAND, self.ARGS, self.MAXPROCS,
info=self.INFO, root=self.ROOT,
errcodes=errcodes)
child.Barrier()
child.Disconnect()
rank = self.COMM.Get_rank()
self.assertEqual(len(errcodes), self.MAXPROCS)
for errcode in errcodes:
self.assertEqual(errcode, MPI.SUCCESS)
def testArgsOnlyAtRoot(self):
self.COMM.Barrier()
rank = self.COMM.Get_rank()
if rank == self.ROOT:
child = self.COMM.Spawn(self.COMMAND, self.ARGS, self.MAXPROCS,
info=self.INFO, root=self.ROOT)
else:
child = self.COMM.Spawn(None, None, -1,
info=None, root=self.ROOT)
child.Barrier()
child.Disconnect()
self.COMM.Barrier()
def testCommSpawnMultiple(self):
COMMAND = [self.COMMAND] * 3
ARGS = [self.ARGS] * len(COMMAND)
MAXPROCS = [self.MAXPROCS] * len(COMMAND)
INFO = [self.INFO] * len(COMMAND)
child = self.COMM.Spawn_multiple(
COMMAND, ARGS, MAXPROCS,
info=INFO, root=self.ROOT)
local_size = child.Get_size()
remote_size = child.Get_remote_size()
child.Barrier()
child.Disconnect()
self.assertEqual(local_size, self.COMM.Get_size())
self.assertEqual(remote_size, sum(MAXPROCS))
def testReturnedErrcodesMultiple(self):
COMMAND = [self.COMMAND]*3
ARGS = [self.ARGS]*len(COMMAND)
MAXPROCS = range(1, len(COMMAND)+1)
INFO = MPI.INFO_NULL
errcodelist = []
child = self.COMM.Spawn_multiple(
COMMAND, ARGS, MAXPROCS,
info=INFO, root=self.ROOT,
errcodes=errcodelist)
child.Barrier()
child.Disconnect()
rank = self.COMM.Get_rank()
self.assertEqual(len(errcodelist), len(COMMAND))
for i, errcodes in enumerate(errcodelist):
self.assertEqual(len(errcodes), MAXPROCS[i])
for errcode in errcodes:
self.assertEqual(errcode, MPI.SUCCESS)
def testArgsOnlyAtRootMultiple(self):
self.COMM.Barrier()
rank = self.COMM.Get_rank()
if rank == self.ROOT:
COMMAND = [self.COMMAND] * 3
ARGS = [self.ARGS] * len(COMMAND)
MAXPROCS = range(2, len(COMMAND)+2)
INFO = [MPI.INFO_NULL] * len(COMMAND)
child = self.COMM.Spawn_multiple(
COMMAND, ARGS, MAXPROCS,
info=INFO, root=self.ROOT)
else:
child = self.COMM.Spawn_multiple(
None, None, -1,
info=None, root=self.ROOT)
child.Barrier()
child.Disconnect()
self.COMM.Barrier()
class TestSpawnSelf(BaseTestSpawn, unittest.TestCase):
COMM = MPI.COMM_SELF
class TestSpawnWorld(BaseTestSpawn, unittest.TestCase):
COMM = MPI.COMM_WORLD
class TestSpawnSelfMany(BaseTestSpawn, unittest.TestCase):
COMM = MPI.COMM_SELF
MAXPROCS = MPI.COMM_WORLD.Get_size()
class TestSpawnWorldMany(BaseTestSpawn, unittest.TestCase):
COMM = MPI.COMM_WORLD
MAXPROCS = MPI.COMM_WORLD.Get_size()
_SKIP_TEST = False
_name, _version = MPI.get_vendor()
if _name == 'Open MPI':
if _version < (1, 5, 0):
_SKIP_TEST = True
elif _version < (1, 4, 0):
_SKIP_TEST = True
if 'win' in sys.platform:
_SKIP_TEST = True
elif _name == 'MPICH2':
if _version < (1, 0, 6):
_SKIP_TEST = True
if 'win' in sys.platform:
_SKIP_TEST = True
elif _name == 'Microsoft MPI':
_SKIP_TEST = True
elif _name == 'HP MPI':
_SKIP_TEST = True
elif MPI.Get_version() < (2, 0):
_SKIP_TEST = True
if _SKIP_TEST:
del BaseTestSpawn
del TestSpawnSelf
del TestSpawnWorld
del TestSpawnSelfMany
del TestSpawnWorldMany
elif _name == 'MPICH2':
if _version > (1, 2):
# Up to mpich2-1.3.1 when running under Hydra process manager,
# spawn fails for the singleton init case
if MPI.COMM_WORLD.Get_attr(MPI.APPNUM) is None:
del TestSpawnSelf
del TestSpawnWorld
del TestSpawnSelfMany
del TestSpawnWorldMany
if __name__ == '__main__':
unittest.main()
|