我正在尝试使用mpi4py的sendrecv()来传递字典obj。
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
,我会得到一堆“无”,因此字典idxdict
不会在核心之间传递。如果我使用字典作为缓冲区:buffer={}
,则会出现类型错误:TypeError: expected a writeable buffer object
。
我做错了什么?非常感谢你的帮助。
答案 0 :(得分: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