def ring(comm, count=1, loop=1, skip=0): size_p = ffi.new("int*") rank_p = ffi.new("int*") lib.MPI_Comm_size(comm, size_p) lib.MPI_Comm_rank(comm, rank_p) size = size_p[0] rank = rank_p[0] source = (rank - 1) % size dest = (rank + 1) % size sbuf = ffi.new("unsigned char[]", [42] * count) rbuf = ffi.new("unsigned char[]", [0] * count) iterations = list(range((loop + skip))) if size == 1: for i in iterations: if i == skip: tic = lib.MPI_Wtime() lib.MPI_Sendrecv( sbuf, count, lib.MPI_BYTE, dest, 0, rbuf, count, lib.MPI_BYTE, source, 0, comm, lib.MPI_STATUS_IGNORE ) else: if rank == 0: for i in iterations: if i == skip: tic = lib.MPI_Wtime() lib.MPI_Send(sbuf, count, lib.MPI_BYTE, dest, 0, comm) lib.MPI_Recv(rbuf, count, lib.MPI_BYTE, source, 0, comm, lib.MPI_STATUS_IGNORE) else: sbuf = rbuf for i in iterations: if i == skip: tic = lib.MPI_Wtime() lib.MPI_Recv(rbuf, count, lib.MPI_BYTE, source, 0, comm, lib.MPI_STATUS_IGNORE) lib.MPI_Send(sbuf, count, lib.MPI_BYTE, dest, 0, comm) toc = lib.MPI_Wtime() if rank == 0 and ffi.string(sbuf) != ffi.string(rbuf): import warnings, traceback try: warnings.warn("received message does not match!") except UserWarning: traceback.print_exc() lib.MPI_Abort(comm, 2) return toc - tic
def ring(comm, count=1, loop=1, skip=0): size_p = ffi.new('int*') rank_p = ffi.new('int*') lib.MPI_Comm_size(comm, size_p) lib.MPI_Comm_rank(comm, rank_p) size = size_p[0] rank = rank_p[0] source = (rank - 1) % size dest = (rank + 1) % size sbuf = ffi.new('unsigned char[]', [42]*count) rbuf = ffi.new('unsigned char[]', [ 0]*count) iterations = list(range((loop+skip))) if size == 1: for i in iterations: if i == skip: tic = lib.MPI_Wtime() lib.MPI_Sendrecv(sbuf, count, lib.MPI_BYTE, dest, 0, rbuf, count, lib.MPI_BYTE, source, 0, comm, lib.MPI_STATUS_IGNORE) else: if rank == 0: for i in iterations: if i == skip: tic = lib.MPI_Wtime() lib.MPI_Send(sbuf, count, lib.MPI_BYTE, dest, 0, comm) lib.MPI_Recv(rbuf, count, lib.MPI_BYTE, source, 0, comm, lib.MPI_STATUS_IGNORE) else: sbuf = rbuf for i in iterations: if i == skip: tic = lib.MPI_Wtime() lib.MPI_Recv(rbuf, count, lib.MPI_BYTE, source, 0, comm, lib.MPI_STATUS_IGNORE) lib.MPI_Send(sbuf, count, lib.MPI_BYTE, dest, 0, comm) toc = lib.MPI_Wtime() if rank == 0 and ffi.string(sbuf) != ffi.string(rbuf): import warnings, traceback try: warnings.warn("received message does not match!") except UserWarning: traceback.print_exc() lib.MPI_Abort(comm, 2) return toc - tic
def ringtest(comm): size = 1 loop = 1 skip = 0 lib.MPI_Barrier(comm) elapsed = ring(comm, size, loop, skip) size_p = ffi.new("int*") rank_p = ffi.new("int*") lib.MPI_Comm_size(comm, size_p) lib.MPI_Comm_rank(comm, rank_p) comm_size = size_p[0] comm_rank = rank_p[0] if comm_rank == 0: print("time for %d loops = %g seconds (%d processes, %d bytes)" % (loop, elapsed, comm_size, size))
def ringtest(comm): size = ( 1 ) loop = ( 1 ) skip = ( 0 ) lib.MPI_Barrier(comm) elapsed = ring(comm, size, loop, skip) size_p = ffi.new('int*') rank_p = ffi.new('int*') lib.MPI_Comm_size(comm, size_p) lib.MPI_Comm_rank(comm, rank_p) comm_size = size_p[0] comm_rank = rank_p[0] if comm_rank == 0: print ("time for %d loops = %g seconds (%d processes, %d bytes)" % (loop, elapsed, comm_size, size))
from libmpi import ffi, lib NULL = ffi.NULL size_p = ffi.new('int*') rank_p = ffi.new('int*') nlen_p = ffi.new('int*') name_p = ffi.new('char[]', lib.MPI_MAX_PROCESSOR_NAME); lib.MPI_Init(NULL, NULL); lib.MPI_Comm_size(lib.MPI_COMM_WORLD, size_p) lib.MPI_Comm_rank(lib.MPI_COMM_WORLD, rank_p) lib.MPI_Get_processor_name(name_p, nlen_p) size = size_p[0] rank = rank_p[0] nlen = nlen_p[0] name = ffi.string(name_p[0:nlen]) print("Hello, World! I am process %d of %d on %s." % (rank, size, name)) lib.MPI_Finalize()
def osu_latency( BENCHMARH = "MPI Latency Test", skip = 1000, loop = 10000, skip_large = 10, loop_large = 100, large_message_size = 8192, MAX_MSG_SIZE = 1<<22, ): myid = ffi.new('int*') numprocs = ffi.new('int*') MPI_Comm_rank(MPI_COMM_WORLD, myid) MPI_Comm_size(MPI_COMM_WORLD, numprocs) myid = myid[0] numprocs = numprocs[0] if numprocs != 2: if myid == 0: errmsg = "This test requires exactly two processes" else: errmsg = None raise SystemExit(errmsg) sbuf = ffi.new('unsigned char[]', MAX_MSG_SIZE) rbuf = ffi.new('unsigned char[]', MAX_MSG_SIZE) dtype = MPI_BYTE tag = 1 comm = MPI_COMM_WORLD status = MPI_STATUS_IGNORE if myid == 0: print ('# %s' % (BENCHMARH,)) if myid == 0: print ('# %-8s%20s' % ("Size [B]", "Latency [us]")) message_sizes = [0] + [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 iterations = list(range(loop+skip)) # MPI_Barrier(comm) if myid == 0: for i in iterations: if i == skip: t_start = MPI_Wtime() MPI_Send(sbuf, size, dtype, 1, tag, comm) MPI_Recv(rbuf, size, dtype, 1, tag, comm, status) t_end = MPI_Wtime() elif myid == 1: for i in iterations: MPI_Recv(rbuf, size, dtype, 0, tag, comm, status) MPI_Send(sbuf, size, dtype, 0, tag, comm) # if myid == 0: latency = (t_end - t_start) * 1e6 / (2 * loop) print ('%-10d%20.2f' % (size, latency))
def osu_latency( BENCHMARH="MPI Latency Test", skip=1000, loop=10000, skip_large=10, loop_large=100, large_message_size=8192, MAX_MSG_SIZE=1 << 22, ): myid = ffi.new('int*') numprocs = ffi.new('int*') lib.MPI_Comm_rank(lib.MPI_COMM_WORLD, myid) lib.MPI_Comm_size(lib.MPI_COMM_WORLD, numprocs) myid = myid[0] numprocs = numprocs[0] if numprocs != 2: if myid == 0: errmsg = "This test requires exactly two processes" else: errmsg = None raise SystemExit(errmsg) sbuf = ffi.new('unsigned char[]', MAX_MSG_SIZE) rbuf = ffi.new('unsigned char[]', MAX_MSG_SIZE) dtype = lib.MPI_BYTE tag = 1 comm = lib.MPI_COMM_WORLD status = lib.MPI_STATUS_IGNORE if myid == 0: print('# %s' % (BENCHMARH, )) if myid == 0: print('# %-8s%20s' % ("Size [B]", "Latency [us]")) message_sizes = [0] + [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 iterations = list(range(loop + skip)) # lib.MPI_Barrier(comm) if myid == 0: for i in iterations: if i == skip: t_start = lib.MPI_Wtime() lib.MPI_Send(sbuf, size, dtype, 1, tag, comm) lib.MPI_Recv(rbuf, size, dtype, 1, tag, comm, status) t_end = lib.MPI_Wtime() elif myid == 1: for i in iterations: lib.MPI_Recv(rbuf, size, dtype, 0, tag, comm, status) lib.MPI_Send(sbuf, size, dtype, 0, tag, comm) # if myid == 0: latency = (t_end - t_start) * 1e6 / (2 * loop) print('%-10d%20.2f' % (size, latency))
from libmpi import ffi, lib NULL = ffi.NULL size_p = ffi.new('int*') rank_p = ffi.new('int*') nlen_p = ffi.new('int*') name_p = ffi.new('char[]', lib.MPI_MAX_PROCESSOR_NAME) lib.MPI_Init(NULL, NULL) lib.MPI_Comm_size(lib.MPI_COMM_WORLD, size_p) lib.MPI_Comm_rank(lib.MPI_COMM_WORLD, rank_p) lib.MPI_Get_processor_name(name_p, nlen_p) size = size_p[0] rank = rank_p[0] nlen = nlen_p[0] name = ffi.string(name_p[0:nlen]) print("Hello, World! I am process %d of %d on %s." % (rank, size, name)) lib.MPI_Finalize()