使用python MPI sendrecv() 传递python对象
我正在尝试使用mpi4py的sendrecv()来传递一个字典对象。
from mpi4py import MPI
comm=MPI_COMM_WORLD
rnk=comm.Get_rank()
size=comm.Get_size()
idxdict={1:2}
buffer=None
comm.sendrecv(idxdict,dest=(rnk+1)%size,sendtag=rnk,recvobj=buffer,source=(rnk-1+size)%size,recvtag=(rnk-1+size)%size)
idxdict=buffer
如果我在最后一步打印idxidct
,我会看到一堆“None”,这说明字典idxdict
没有在不同的核心之间传递。如果我用一个字典作为缓冲区:buffer={}
,那么就会出现类型错误:TypeError: expected a writeable buffer object
。
我到底做错了什么呢?非常感谢你的帮助。
1 个回答
1
我觉得这里的文档有点误导人;sendrecv这个函数返回的是接收到的数据缓冲区,而我看到的并没有使用你传入的接收对象(至少在旧版本1.2.x中是这样的)。所以你上面的代码是不能正常工作的(虽然实际上数据是有接收到的),但是下面的代码可以:
from mpi4py import MPI
comm=MPI.COMM_WORLD
rnk=comm.Get_rank()
size=comm.Get_size()
idxdict={1:2}
buffer = comm.sendrecv(sendobj=idxdict,dest=(rnk+1)%size,source=(rnk-1+size)%size)
print "idxdict = ", idxdict
print "buffer = ", buffer