def testNeighborAlltoallwBottom(self): size = self.COMM.Get_size() for comm in create_topo_comms(self.COMM): rsize, ssize = get_neighbors_count(comm) for array, typecode in arrayimpl.loop(): for n in range(1, 4): for v in range(3): sbuf = array(v, typecode, (ssize, n)) rbuf = array(-1, typecode, (rsize, n)) saddr = MPI.Get_address(sbuf.as_raw()) raddr = MPI.Get_address(rbuf.as_raw()) sdt, rdt = sbuf.mpidtype, rbuf.mpidtype sdsp = list( range(0, ssize * n * sdt.extent, n * sdt.extent)) rdsp = list( range(0, rsize * n * rdt.extent, n * rdt.extent)) sdsp = [saddr + d for d in sdsp] rdsp = [raddr + d for d in rdsp] smsg = [MPI.BOTTOM, ([n] * ssize, sdsp), [sdt] * ssize] rmsg = (MPI.BOTTOM, ([n] * rsize, rdsp), [rdt] * rsize) try: comm.Neighbor_alltoallw(smsg, rmsg) except NotImplementedError: self.skipTest('mpi-neighbor_alltoallw') for value in rbuf.flat: self.assertEqual(value, v) sbuf.flat[:] = array(v + 1, typecode, (ssize, n)).flat try: comm.Ineighbor_alltoallw(smsg, rmsg).Wait() except NotImplementedError: self.skipTest('mpi-neighbor_alltoallw') for value in rbuf.flat: self.assertEqual(value, v + 1) comm.Free()
def testAlltoallwBottom(self): size = self.COMM.Get_size() rank = self.COMM.Get_rank() for array, typecode in arrayimpl.loop(): for n in range(1, size + 1): sbuf = array(n, typecode, (size, n)) rbuf = array(-1, typecode, (size, n)) saddr = MPI.Get_address(sbuf.as_raw()) raddr = MPI.Get_address(rbuf.as_raw()) sdt, rdt = sbuf.mpidtype, rbuf.mpidtype stypes = [ MPI.Datatype.Create_struct([n], [saddr + d], [sdt]).Commit() for d in list( range(0, size * n * sdt.extent, n * sdt.extent)) ] rtypes = [ MPI.Datatype.Create_struct([n], [raddr + d], [sdt]).Commit() for d in list( range(0, size * n * rdt.extent, n * rdt.extent)) ] smsg = (MPI.BOTTOM, ([1] * size, [0] * size), stypes) rmsg = (MPI.BOTTOM, ([1] * size, [0] * size), rtypes) try: self.COMM.Alltoallw(smsg, rmsg) except NotImplementedError: self.skipTest('mpi-alltoallw') finally: for t in stypes: t.Free() for t in rtypes: t.Free() for value in rbuf.flat: self.assertEqual(value, n)
def testSharedQuery(self): memory = self.WIN.tomemory() address = MPI.Get_address(memory) length = len(memory) memories = self.COMM.allgather((address, length)) rank = self.COMM.Get_rank() size = self.COMM.Get_size() for i in range(size): mem, disp = self.WIN.Shared_query(rank) base = MPI.Get_address(mem) size = len(mem) if i == rank: self.assertEqual(base, memories[i][0]) self.assertEqual(size, memories[i][1]) self.assertEqual(disp, 1)
def testMessageBottom(self): sbuf = b"abcxyz" rbuf = bytearray(6) saddr = MPI.Get_address(sbuf) raddr = MPI.Get_address(rbuf) stype = MPI.Datatype.Create_struct([6], [saddr], [MPI.CHAR]).Commit() rtype = MPI.Datatype.Create_struct([6], [raddr], [MPI.CHAR]).Commit() smsg = [MPI.BOTTOM, [1], [0] , [stype]] rmsg = [MPI.BOTTOM, ([1], [0]), [rtype]] try: Alltoallw(smsg, rmsg) self.assertEqual(sbuf, rbuf) finally: stype.Free() rtype.Free()
def testAintDiff(self): location = array.array('i', range(10)) base = MPI.Get_address(location) addr1 = base + 8 addr2 = base + 4 diff = MPI.Aint_diff(addr1, addr2) self.assertEqual(diff, 4)
def testGetAddress1(self): from struct import pack, unpack location = array.array('i', range(10)) bufptr, _ = location.buffer_info() addr = MPI.Get_address(location) addr = unpack('P', pack('P', addr))[0] self.assertEqual(addr, bufptr)
def testGetAttr(self): base = MPI.Get_address(self.memory) size = len(self.memory) unit = 1 self.assertEqual(size, self.WIN.Get_attr(MPI.WIN_SIZE)) self.assertEqual(unit, self.WIN.Get_attr(MPI.WIN_DISP_UNIT)) self.assertEqual(base, self.WIN.Get_attr(MPI.WIN_BASE))
def testGetAddress2(self): from struct import pack, unpack location = numpy.asarray(range(10), dtype='i') bufptr, _ = location.__array_interface__['data'] addr = MPI.Get_address(location) addr = unpack('P', pack('P', addr))[0] self.assertEqual(addr, bufptr)
def testMemory(self): memory = self.WIN.tomemory() pointer = MPI.Get_address(memory) length = len(memory) base, size, dunit = self.WIN.attrs self.assertEqual(size, length) self.assertEqual(dunit, 1) self.assertEqual(base, pointer)
def testGetAddress(self): try: from array import array location = array('i', range(10)) bufptr, _ = location.buffer_info() addr = MPI.Get_address(location) self.assertEqual(addr, bufptr) except ImportError: pass try: from numpy import asarray location = asarray(range(10), dtype='i') bufptr, _ = location.__array_interface__['data'] addr = MPI.Get_address(location) self.assertEqual(addr, bufptr) except ImportError: pass
def testAintAdd(self): try: from array import array except ImportError: return location = array('i', range(10)) base = MPI.Get_address(location) addr = MPI.Aint_add(base, 4) self.assertEqual(addr, base + 4)
def testCapsule(self): buf = DLPackCPUBuf('i', [0,1,2,3]) # capsule = buf.__dlpack__() MPI.Get_address(buf) MPI.Get_address(buf) del capsule # capsule = buf.__dlpack__() retvals = [capsule] * 2 buf.__dlpack__ = lambda *args, **kwargs: retvals.pop() MPI.Get_address(buf) self.assertRaises(BufferError, MPI.Get_address, buf) del buf.__dlpack__ del capsule # buf.__dlpack__ = lambda *args, **kwargs: None self.assertRaises(BufferError, MPI.Get_address, buf) del buf.__dlpack__
def testContiguous(self): buf = DLPackCPUBuf('i', range(8)) dltensor = buf.managed.dl_tensor # dltensor.ndim, dltensor.shape, dltensor.strides = \ dlpack.make_dl_shape([2, 2, 2], order='C') s = dltensor.strides strides = [s[i] for i in range(dltensor.ndim)] s[0], s[1], s[2] = [strides[i] for i in [0, 1, 2]] MPI.Get_address(buf) s[0], s[1], s[2] = [strides[i] for i in [2, 1, 0]] MPI.Get_address(buf) s[0], s[1], s[2] = [strides[i] for i in [0, 2, 1]] self.assertRaises(BufferError, MPI.Get_address, buf) s[0], s[1], s[2] = [strides[i] for i in [1, 0, 2]] self.assertRaises(BufferError, MPI.Get_address, buf) del s # del dltensor
def testAttributes(self): cgroup = self.COMM.Get_group() wgroup = self.WIN.Get_group() grpcmp = MPI.Group.Compare(cgroup, wgroup) cgroup.Free() wgroup.Free() self.assertEqual(grpcmp, MPI.IDENT) base, size, unit = self.WIN.attrs self.assertEqual(size, len(self.memory)) self.assertEqual(unit, 1) self.assertEqual(base, MPI.Get_address(self.memory))
def testAintDiff(self): try: from array import array except ImportError: return location = array('i', range(10)) base = MPI.Get_address(location) addr1 = base + 8 addr2 = base + 4 diff = MPI.Aint_diff(addr1, addr2) self.assertEqual(diff, 4)
def testStrides(self): buf = DLPackCPUBuf('i', range(8)) dltensor = buf.managed.dl_tensor # for order in ('C', 'F'): dltensor.ndim, dltensor.shape, dltensor.strides = \ dlpack.make_dl_shape([2, 2, 2], order=order) MPI.Get_address(buf) dltensor.strides[0] = -1 self.assertRaises(BufferError, MPI.Get_address, buf) # del dltensor
def testNdim(self): buf = DLPackCPUBuf('i', [0,1,2,3]) dltensor = buf.managed.dl_tensor # for ndim in (2, 1, 0): dltensor.ndim = ndim MPI.Get_address(buf) # dltensor.ndim = -1 self.assertRaises(BufferError, MPI.Get_address, buf) # del dltensor
def testDevice(self): buf = DLPackCPUBuf('i', [0,1,2,3]) buf.__dlpack_device__ = None self.assertRaises(TypeError, MPI.Get_address, buf) buf.__dlpack_device__ = lambda: None self.assertRaises(TypeError, MPI.Get_address, buf) buf.__dlpack_device__ = lambda: (None, 0) self.assertRaises(TypeError, MPI.Get_address, buf) buf.__dlpack_device__ = lambda: (1, None) self.assertRaises(TypeError, MPI.Get_address, buf) buf.__dlpack_device__ = lambda: (1,) self.assertRaises(ValueError, MPI.Get_address, buf) buf.__dlpack_device__ = lambda: (1, 0, 1) self.assertRaises(ValueError, MPI.Get_address, buf) del buf.__dlpack_device__ MPI.Get_address(buf)
def testShape(self): buf = DLPackCPUBuf('i', [0,1,2,3]) dltensor = buf.managed.dl_tensor # dltensor.ndim = 1 dltensor.shape[0] = -1 self.assertRaises(BufferError, MPI.Get_address, buf) # dltensor.ndim = 0 dltensor.shape = None MPI.Get_address(buf) # dltensor.ndim = 1 dltensor.shape = None self.assertRaises(BufferError, MPI.Get_address, buf) # del dltensor
def testAintAdd(self): location = array.array('i', range(10)) base = MPI.Get_address(location) addr = MPI.Aint_add(base, 4) self.assertEqual(addr, base + 4)
def testBottom(self): base = MPI.Get_address(MPI.BOTTOM) addr = MPI.Aint_add(base, 0) self.assertEqual(addr, base) diff = MPI.Aint_diff(base, base) self.assertEqual(diff, 0)
buf[0] = b'x' except TypeError as e: print e # create a memory view of mem mv = memoryview(mem) # create a memory view of mem1 mv1 = memoryview(mem1) print 'before change: mv[0] = %s, mv1[0] = %s' % (mv[0], mv1[0]) # change mv[0] mv[0] = 'x' print 'after change: mv[0] = %s, mv1[0] = %s' % (mv[0], mv1[0]) # release the memory object mem.release() print # allocate a memory of 40 bytes, return a MPI.memory object mem = MPI.Alloc_mem(10 * 4) print 'len(mem):', len(mem) print 'mem.address:', MPI.Get_address(mem) # create a numpy array from the allocated memory # NOTE: use copy = False here to avoid the copy buf = np.array(mem, dtype='B', copy=False) # cast to be int array npary = np.ndarray(buffer=buf, dtype='i', shape=(10, )) # now you can operate the memory buffer by the usual numpy array operations npary[:] = np.arange(10) print 'npary.tobytes:', npary.tobytes() # release the memory object MPI.Free_mem(mem) print 'len(mem) after free:', len(mem)
# Aint_add_diff.py """ Demonstrates the usage of MPI.Aint_add and MPI.Aint_diff. Run this with 2 processes like: $ mpiexec -n 2 python Aint_add_diff.py """ import numpy as np from mpi4py import MPI comm = MPI.COMM_WORLD rank = comm.rank ary = np.arange(10, dtype='i') base = MPI.Get_address(ary) print 'rank %d has base address: %d' % (rank, base) disp = 4 addr = MPI.Aint_add(base, disp) print 'rank %d has base + %d = %d' % (rank, disp, addr) diff = MPI.Aint_diff(addr, base) print 'rank %d has %d - base = %d' % (rank, addr, diff)
def testNone(self): base = MPI.Get_address(None) addr = MPI.Aint_add(base, 0) self.assertEqual(addr, base) diff = MPI.Aint_diff(base, base) self.assertEqual(diff, 0)
def testAttributes(self): base, size, unit = self.WIN.attrs self.assertEqual(base, MPI.Get_address(self.memory)) self.assertEqual(size, len(self.memory)) self.assertEqual(unit, 1)
def testMemory(self): memory = self.WIN.tomemory() base = MPI.Get_address(memory) size = len(memory) self.assertEqual(base, 0) self.assertEqual(size, 0)
def testGetAddress(self): from array import array location = array('i', range(10)) addr = MPI.Get_address(location) bufptr, buflen = location.buffer_info() self.assertEqual(addr, bufptr)