def testSendRecv(self): size = self.COMM.Get_size() rank = self.COMM.Get_rank() for array, typecode in arrayimpl.loop(): with arrayimpl.test(self): if unittest.is_mpi_gpu('openmpi', array): continue if unittest.is_mpi_gpu('mvapich2', array): continue for s in range(0, size + 1): with self.subTest(s=s): # sbuf = array(s, typecode, s) rbuf = array(-1, typecode, s) mem = array(0, typecode, 2 * (s + MPI.BSEND_OVERHEAD)).as_raw() if size == 1: MPI.Attach_buffer(mem) rbuf = sbuf MPI.Detach_buffer() elif rank == 0: MPI.Attach_buffer(mem) self.COMM.Ibsend(sbuf.as_mpi(), 1, 0).Wait() self.COMM.Bsend(sbuf.as_mpi(), 1, 0) MPI.Detach_buffer() self.COMM.Send(sbuf.as_mpi(), 1, 0) self.COMM.Ssend(sbuf.as_mpi(), 1, 0) self.COMM.Recv(rbuf.as_mpi(), 1, 0) self.COMM.Recv(rbuf.as_mpi(), 1, 0) self.COMM.Recv(rbuf.as_mpi(), 1, 0) self.COMM.Recv(rbuf.as_mpi(), 1, 0) elif rank == 1: self.COMM.Recv(rbuf.as_mpi(), 0, 0) self.COMM.Recv(rbuf.as_mpi(), 0, 0) self.COMM.Recv(rbuf.as_mpi(), 0, 0) self.COMM.Recv(rbuf.as_mpi(), 0, 0) MPI.Attach_buffer(mem) self.COMM.Ibsend(sbuf.as_mpi(), 0, 0).Wait() self.COMM.Bsend(sbuf.as_mpi(), 0, 0) MPI.Detach_buffer() self.COMM.Send(sbuf.as_mpi(), 0, 0) self.COMM.Ssend(sbuf.as_mpi(), 0, 0) else: rbuf = sbuf for value in rbuf: self.assertEqual(value, s) # rank = self.COMM.Get_rank() sbuf = array(s, typecode, s) rbuf = array(-1, typecode, s) rreq = self.COMM.Irecv(rbuf.as_mpi(), rank, 0) self.COMM.Rsend(sbuf.as_mpi(), rank, 0) rreq.Wait() for value in rbuf: self.assertEqual(value, s) rbuf = array(-1, typecode, s) rreq = self.COMM.Irecv(rbuf.as_mpi(), rank, 0) self.COMM.Irsend(sbuf.as_mpi(), rank, 0).Wait() rreq.Wait() for value in rbuf: self.assertEqual(value, s)
def testSendRecv(self): size = self.COMM.Get_size() rank = self.COMM.Get_rank() for array in arrayimpl.ArrayTypes: for typecode in arrayimpl.TypeMap: for s in range(0, size): # sbuf = array(s, typecode, s) rbuf = array(-1, typecode, s) mem = array(0, typecode, 2 * (s + MPI.BSEND_OVERHEAD)).as_raw() if size == 1: MPI.Attach_buffer(mem) rbuf = sbuf MPI.Detach_buffer() elif rank == 0: MPI.Attach_buffer(mem) self.COMM.Ibsend(sbuf.as_mpi(), 1, 0).Wait() self.COMM.Bsend(sbuf.as_mpi(), 1, 0) MPI.Detach_buffer() self.COMM.Send(sbuf.as_mpi(), 1, 0) self.COMM.Ssend(sbuf.as_mpi(), 1, 0) self.COMM.Recv(rbuf.as_mpi(), 1, 0) self.COMM.Recv(rbuf.as_mpi(), 1, 0) self.COMM.Recv(rbuf.as_mpi(), 1, 0) self.COMM.Recv(rbuf.as_mpi(), 1, 0) elif rank == 1: self.COMM.Recv(rbuf.as_mpi(), 0, 0) self.COMM.Recv(rbuf.as_mpi(), 0, 0) self.COMM.Recv(rbuf.as_mpi(), 0, 0) self.COMM.Recv(rbuf.as_mpi(), 0, 0) MPI.Attach_buffer(mem) self.COMM.Ibsend(sbuf.as_mpi(), 0, 0).Wait() self.COMM.Bsend(sbuf.as_mpi(), 0, 0) MPI.Detach_buffer() self.COMM.Send(sbuf.as_mpi(), 0, 0) self.COMM.Ssend(sbuf.as_mpi(), 0, 0) else: rbuf = sbuf for value in rbuf: self.assertEqual(value, s) # rank = self.COMM.Get_rank() sbuf = array(s, typecode, s) rbuf = array(-1, typecode, s) rreq = self.COMM.Irecv(rbuf.as_mpi(), rank, 0) self.COMM.Rsend(sbuf.as_mpi(), rank, 0) rreq.Wait() for value in rbuf: self.assertEqual(value, s) rbuf = array(-1, typecode, s) rreq = self.COMM.Irecv(rbuf.as_mpi(), rank, 0) self.COMM.Irsend(sbuf.as_mpi(), rank, 0).Wait() rreq.Wait() for value in rbuf: self.assertEqual(value, s)
def testIBSendAndRecv(self): buf = MPI.Alloc_mem((1 << 16) + MPI.BSEND_OVERHEAD) MPI.Attach_buffer(buf) try: size = self.COMM.Get_size() rank = self.COMM.Get_rank() for smess in messages: req = self.COMM.ibsend(smess, MPI.PROC_NULL) self.assertTrue(req) req.wait() self.assertFalse(req) rmess = self.COMM.recv(None, MPI.PROC_NULL, 0) self.assertEqual(rmess, None) for smess in messages: req = self.COMM.ibsend(smess, rank, 0) self.assertTrue(req) rmess = self.COMM.recv(None, rank, 0) self.assertTrue(req) flag, _ = req.test() self.assertTrue(flag) self.assertFalse(req) self.assertEqual(rmess, smess) for smess in messages: dst = (rank + 1) % size src = (rank - 1) % size req = self.COMM.ibsend(smess, dst, 0) self.assertTrue(req) rmess = self.COMM.recv(None, src, 0) req.wait() self.assertFalse(req) self.assertEqual(rmess, smess) finally: MPI.Detach_buffer() MPI.Free_mem(buf)
def testProcNullPersistent(self): comm = self.COMM # req = comm.Send_init(None, MPI.PROC_NULL) req.Start() req.Wait() req.Free() # req = comm.Ssend_init(None, MPI.PROC_NULL) req.Start() req.Wait() req.Free() # buf = MPI.Alloc_mem(MPI.BSEND_OVERHEAD) MPI.Attach_buffer(buf) req = comm.Bsend_init(None, MPI.PROC_NULL) req.Start() req.Wait() req.Free() MPI.Detach_buffer() MPI.Free_mem(buf) # req = comm.Rsend_init(None, MPI.PROC_NULL) req.Start() req.Wait() req.Free() # req = comm.Recv_init(None, MPI.PROC_NULL) req.Start() req.Wait() req.Free()
def buffer(package, sends, csvfile): buffer_size = 5 * package buf = bytearray([0] * buffer_size) comm.Barrier() time = MPI.Wtime() if rank == 0: for i in range(sends): data = bytearray(package) comm.Recv(data, source=1, tag=11) if i % (buffer_size / package) == 0: # flushing the buffer MPI.Detach_buffer() MPI.Attach_buffer(buf) comm.Send(data, dest=1, tag=11) elif rank == 1: for i in range(sends): data = bytearray(package) if i % (buffer_size / package) == 0: MPI.Detach_buffer() MPI.Attach_buffer(buf) comm.Send(data, dest=0, tag=11) comm.Recv(data, source=0, tag=11) MPI.Detach_buffer() time = MPI.Wtime() - time capacity = float(2 * package * sends * 8) / (float(1000000) * time) delay = time / (float(sends) * 2) print(str(capacity) + "Mb/s") print(str(delay) + "s delay") spamwriter = csv.writer(csvfile, delimiter=',', quotechar='|', quoting=csv.QUOTE_MINIMAL) spamwriter.writerow([package, sends, capacity, delay])
def testProcNull(self): comm = self.COMM # comm.Sendrecv(None, MPI.PROC_NULL, 0, None, MPI.PROC_NULL, 0) comm.Sendrecv_replace(None, MPI.PROC_NULL, 0, MPI.PROC_NULL, 0) # comm.Send(None, MPI.PROC_NULL) comm.Isend(None, MPI.PROC_NULL).Wait() req = comm.Send_init(None, MPI.PROC_NULL) req.Start() req.Wait() req.Free() # comm.Ssend(None, MPI.PROC_NULL) comm.Issend(None, MPI.PROC_NULL).Wait() req = comm.Ssend_init(None, MPI.PROC_NULL) req.Start() req.Wait() req.Free() # buf = MPI.Alloc_mem(MPI.BSEND_OVERHEAD) MPI.Attach_buffer(buf) comm.Bsend(None, MPI.PROC_NULL) comm.Ibsend(None, MPI.PROC_NULL).Wait() req = comm.Bsend_init(None, MPI.PROC_NULL) req.Start() req.Wait() req.Free() MPI.Detach_buffer() MPI.Free_mem(buf) # comm.Rsend(None, MPI.PROC_NULL) comm.Irsend(None, MPI.PROC_NULL).Wait() req = comm.Rsend_init(None, MPI.PROC_NULL) req.Start() req.Wait() req.Free() # comm.Recv(None, MPI.PROC_NULL) comm.Irecv(None, MPI.PROC_NULL).Wait() req = comm.Recv_init(None, MPI.PROC_NULL) req.Start() req.Wait() req.Free()
def testIRecvAndBSend(self): comm = self.COMM rank = comm.Get_rank() buf = MPI.Alloc_mem((1<<16)+MPI.BSEND_OVERHEAD) MPI.Attach_buffer(buf) for smess in messages: src = dst = rank req1 = comm.irecv(None, src, 1) req2 = comm.irecv(None, src, 2) req3 = comm.irecv(None, src, 3) comm.bsend(smess, dst, 3) comm.bsend(smess, dst, 2) comm.bsend(smess, dst, 1) self.assertEqual(smess, req3.wait()) self.assertEqual(smess, req2.wait()) self.assertEqual(smess, req1.wait()) comm.bsend(smess, MPI.PROC_NULL, 3) MPI.Detach_buffer() MPI.Free_mem(buf)
def testIRecvAndIBSend(self): comm = self.COMM rank = comm.Get_rank() buf = MPI.Alloc_mem((1 << 16) + MPI.BSEND_OVERHEAD) MPI.Attach_buffer(buf) try: for smess in messages: src = dst = rank req1 = comm.irecv(None, src, 1) req2 = comm.irecv(None, src, 2) req3 = comm.irecv(None, src, 3) req4 = comm.ibsend(smess, dst, 3) req5 = comm.ibsend(smess, dst, 2) req6 = comm.ibsend(smess, dst, 1) MPI.Request.waitall([req4, req5, req6]) self.assertEqual(smess, req3.wait()) self.assertEqual(smess, req2.wait()) self.assertEqual(smess, req1.wait()) comm.ibsend(smess, MPI.PROC_NULL, 3).wait() finally: MPI.Detach_buffer() MPI.Free_mem(buf)
def testBSendAndRecv(self): buf = MPI.Alloc_mem((1 << 16) + MPI.BSEND_OVERHEAD) MPI.Attach_buffer(buf) try: size = self.COMM.Get_size() rank = self.COMM.Get_rank() for smess in messages: self.COMM.bsend(smess, MPI.PROC_NULL) rmess = self.COMM.recv(None, MPI.PROC_NULL, 0) self.assertEqual(rmess, None) if size == 1: return for smess in messages: if rank == 0: self.COMM.bsend(smess, rank + 1, 0) rmess = smess elif rank == size - 1: rmess = self.COMM.recv(None, rank - 1, 0) else: rmess = self.COMM.recv(None, rank - 1, 0) self.COMM.bsend(rmess, rank + 1, 0) self.assertEqual(rmess, smess) finally: MPI.Detach_buffer() MPI.Free_mem(buf)
def testPersistent(self): size = self.COMM.Get_size() rank = self.COMM.Get_rank() dest = (rank + 1) % size source = (rank - 1) % size for array, typecode in arrayimpl.subTest(self): if unittest.is_mpi_gpu('mvapich2', array): continue for s in range(size): for xs in range(3): # sbuf = array(s, typecode, s) rbuf = array(-1, typecode, s + xs) sendreq = self.COMM.Send_init(sbuf.as_mpi(), dest, 0) recvreq = self.COMM.Recv_init(rbuf.as_mpi(), source, 0) sendreq.Start() recvreq.Start() sendreq.Wait() recvreq.Wait() self.assertNotEqual(sendreq, MPI.REQUEST_NULL) self.assertNotEqual(recvreq, MPI.REQUEST_NULL) sendreq.Free() recvreq.Free() self.assertEqual(sendreq, MPI.REQUEST_NULL) self.assertEqual(recvreq, MPI.REQUEST_NULL) for value in rbuf[:s]: self.assertEqual(value, s) for value in rbuf[s:]: self.assertEqual(value, -1) # sbuf = array(s, typecode, s) rbuf = array(-1, typecode, s + xs) sendreq = self.COMM.Send_init(sbuf.as_mpi(), dest, 0) recvreq = self.COMM.Recv_init(rbuf.as_mpi(), source, 0) reqlist = [sendreq, recvreq] MPI.Prequest.Startall(reqlist) index1 = MPI.Prequest.Waitany(reqlist) self.assertTrue(index1 in [0, 1]) self.assertNotEqual(reqlist[index1], MPI.REQUEST_NULL) index2 = MPI.Prequest.Waitany(reqlist) self.assertTrue(index2 in [0, 1]) self.assertNotEqual(reqlist[index2], MPI.REQUEST_NULL) self.assertTrue(index1 != index2) index3 = MPI.Prequest.Waitany(reqlist) self.assertEqual(index3, MPI.UNDEFINED) for preq in reqlist: self.assertNotEqual(preq, MPI.REQUEST_NULL) preq.Free() self.assertEqual(preq, MPI.REQUEST_NULL) for value in rbuf[:s]: self.assertEqual(value, s) for value in rbuf[s:]: self.assertEqual(value, -1) # sbuf = array(s, typecode, s) rbuf = array(-1, typecode, s + xs) sendreq = self.COMM.Ssend_init(sbuf.as_mpi(), dest, 0) recvreq = self.COMM.Recv_init(rbuf.as_mpi(), source, 0) sendreq.Start() recvreq.Start() sendreq.Wait() recvreq.Wait() self.assertNotEqual(sendreq, MPI.REQUEST_NULL) self.assertNotEqual(recvreq, MPI.REQUEST_NULL) sendreq.Free() recvreq.Free() self.assertEqual(sendreq, MPI.REQUEST_NULL) self.assertEqual(recvreq, MPI.REQUEST_NULL) for value in rbuf[:s]: self.assertEqual(value, s) for value in rbuf[s:]: self.assertEqual(value, -1) # mem = array(0, typecode, s + MPI.BSEND_OVERHEAD).as_raw() sbuf = array(s, typecode, s) rbuf = array(-1, typecode, s + xs) MPI.Attach_buffer(mem) sendreq = self.COMM.Bsend_init(sbuf.as_mpi(), dest, 0) recvreq = self.COMM.Recv_init(rbuf.as_mpi(), source, 0) sendreq.Start() recvreq.Start() sendreq.Wait() recvreq.Wait() MPI.Detach_buffer() self.assertNotEqual(sendreq, MPI.REQUEST_NULL) self.assertNotEqual(recvreq, MPI.REQUEST_NULL) sendreq.Free() recvreq.Free() self.assertEqual(sendreq, MPI.REQUEST_NULL) self.assertEqual(recvreq, MPI.REQUEST_NULL) for value in rbuf[:s]: self.assertEqual(value, s) for value in rbuf[s:]: self.assertEqual(value, -1) # rank = self.COMM.Get_rank() sbuf = array(s, typecode, s) rbuf = array(-1, typecode, s + xs) recvreq = self.COMM.Recv_init(rbuf.as_mpi(), rank, 0) sendreq = self.COMM.Rsend_init(sbuf.as_mpi(), rank, 0) recvreq.Start() sendreq.Start() recvreq.Wait() sendreq.Wait() self.assertNotEqual(sendreq, MPI.REQUEST_NULL) self.assertNotEqual(recvreq, MPI.REQUEST_NULL) sendreq.Free() recvreq.Free() self.assertEqual(sendreq, MPI.REQUEST_NULL) self.assertEqual(recvreq, MPI.REQUEST_NULL) for value in rbuf[:s]: self.assertEqual(value, s) for value in rbuf[s:]: self.assertEqual(value, -1)
import numpy as np from mpi4py import MPI comm = MPI.COMM_WORLD rank = comm.Get_rank() # MPI.BSEND_OVERHEAD gives the extra overhead in buffered mode BUFSISE = 2000 + MPI.BSEND_OVERHEAD buf = bytearray(BUFSISE) # Attach a user-provided buffer for sending in buffered mode MPI.Attach_buffer(buf) count = 10 send_buf = np.arange(count, dtype='i') recv_buf = np.empty(count, dtype='i') if rank == 0: send_req = comm.Bsend_init(send_buf, dest=1, tag=11) send_req.Start() send_req.Wait() print 'process %d sends %s' % (rank, send_buf) elif rank == 1: recv_req = comm.Recv_init(recv_buf, source=0, tag=11) recv_req.Start() recv_req.Wait() print 'process %d receives %s' % (rank, recv_buf) # Remove an existing attached buffer MPI.Detach_buffer()
## mpiexec -n 1 python ex-2.35.py # Calls to attach and detach buffers # -------------------------------------------------------------------- import mpi4py.MPI as MPI import numpy # -------------------------------------------------------------------- BUFSISE = 10000 buff = numpy.empty(BUFSISE, dtype='b') MPI.Attach_buffer(buff) buff2 = MPI.Detach_buffer() MPI.Attach_buffer(buff2) MPI.Detach_buffer() # -------------------------------------------------------------------- assert len(buff2) == BUFSISE # --------------------------------------------------------------------