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
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()
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()