Esempio n. 1
0
 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)
Esempio n. 3
0
 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)
Esempio n. 4
0
 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()
Esempio n. 5
0
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])
Esempio n. 6
0
 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)
Esempio n. 8
0
 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)
Esempio n. 9
0
 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)
Esempio n. 10
0
 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()
Esempio n. 12
0
## 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

# --------------------------------------------------------------------