def allgather( array, comm ): myid = core.comm_rank(comm) nprocs = core.comm_size(comm) if( myid==root ): print nm.size(array) datatype = getMpiType(array) size = nm.size(array) shape = nm.shape(array) rank = nm.rank(array) else: datatype = 0 size = 0 shape = 0 rank = 0 datatype = core.bcast( datatype, 1, core.MPI_INT, root, comm ) rank = core.bcast( rank, 1, core.MPI_INT, root, comm ) shape = core.bcast( shape, rank, core.MPI_INT, root, comm ) size = core.bcast( size, 1, core.MPI_INT, root, comm ) data = core.allgather( array, size, datatype, size, datatype, root, comm ) print shape shape[0] = shape[0] * nprocs print shape array = nm.asarray(data) print nm.size(array) array.shape = shape return array
def allgatherv( message, root = 0,comm=core.MPI_COMM_WORLD ): rank = core.comm_rank( comm ) size = core.comm_size( comm ) s = pickle.dumps(message) recvlengths = core.allgather(len(s),1,core.MPI_INT, 1, core.MPI_INT, root, comm) displacements = [0] displ = 0 for rl in recvlengths[:-1]: displacements.append( displ+rl ) displ += rl #if(rank==root): # print "displacements:",displacements data = core.allgatherv(s, len(s), core.MPI_CHAR, recvlengths, displacements, core.MPI_CHAR, root, comm) data = data.tostring() # print data # print "length of data:",len(data) i,n=0,0 # print recvlengths realdata = [] for length in recvlengths: n += length # print "i,n=%d,%d"%(i,n) # print data[i:n] realdata.append(pickle.loads(data[i:n])) i += length return realdata