2014-06-08 28 views
1

我想用mpi4py的sendrecv()傳遞一個字典obj。python MPI sendrecv()傳遞一個python對象

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,我會得到一堆「無」 S,所以詞典idxdict沒有核心之間通過。如果我使用字典作爲緩衝區:buffer={},那麼有typeerror:TypeError: expected a writeable buffer object

我做錯了什麼?非常感謝您的幫助。

回答

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