123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293 |
- # http://mvapich.cse.ohio-state.edu/benchmarks/
- from mpi4py import MPI
- def osu_bw(
- BENCHMARH = "MPI Bi-Directional Bandwidth Test",
- skip = 10,
- loop = 100,
- window_size = 64,
- skip_large = 2,
- loop_large = 20,
- window_size_large = 64,
- large_message_size = 8192,
- MAX_MSG_SIZE = 1<<22,
- ):
- comm = MPI.COMM_WORLD
- myid = comm.Get_rank()
- numprocs = comm.Get_size()
- if numprocs != 2:
- if myid == 0:
- errmsg = "This test requires exactly two processes"
- else:
- errmsg = None
- raise SystemExit(errmsg)
- s_buf = allocate(MAX_MSG_SIZE)
- r_buf = allocate(MAX_MSG_SIZE)
- if myid == 0:
- print ('# %s' % (BENCHMARH,))
- if myid == 0:
- print ('# %-8s%20s' % ("Size [B]", "Bandwidth [MB/s]"))
- message_sizes = [2**i for i in range(30)]
- for size in message_sizes:
- if size > MAX_MSG_SIZE:
- break
- if size > large_message_size:
- skip = skip_large
- loop = loop_large
- window_size = window_size_large
- iterations = list(range(loop+skip))
- window_sizes = list(range(window_size))
- s_msg = [s_buf, size, MPI.BYTE]
- r_msg = [r_buf, size, MPI.BYTE]
- send_request = [MPI.REQUEST_NULL] * window_size
- recv_request = [MPI.REQUEST_NULL] * window_size
- #
- comm.Barrier()
- if myid == 0:
- for i in iterations:
- if i == skip:
- t_start = MPI.Wtime()
- for j in window_sizes:
- recv_request[j] = comm.Irecv(r_msg, 1, 10)
- for j in window_sizes:
- send_request[j] = comm.Isend(s_msg, 1, 100)
- MPI.Request.Waitall(send_request)
- MPI.Request.Waitall(recv_request)
- t_end = MPI.Wtime()
- elif myid == 1:
- for i in iterations:
- for j in window_sizes:
- recv_request[j] = comm.Irecv(r_msg, 0, 100)
- for j in window_sizes:
- send_request[j] = comm.Isend(s_msg, 0, 10)
- MPI.Request.Waitall(send_request)
- MPI.Request.Waitall(recv_request)
- #
- if myid == 0:
- MB = size / 1e6 * loop * window_size
- s = t_end - t_start
- print ('%-10d%20.2f' % (size, MB/s))
- def allocate(n):
- try:
- import mmap
- return mmap.mmap(-1, n)
- except (ImportError, EnvironmentError):
- try:
- from numpy import zeros
- return zeros(n, 'B')
- except ImportError:
- from array import array
- return array('B', [0]) * n
- if __name__ == '__main__':
- osu_bw()
|