2012-07-11 35 views
5

我試圖使用NumPy中的結構化數組發送和接收MPI4Py中的數據。以下是我的陣列結構:使用NumPy發送和接收MPI4Py中的結構化數組數據

numpy.zeros(FILE_LINES, dtype='i4,54b') 

,我使用的交換數據的SENDRECV方法,如下所示:

comm.Sendrecv(data_send, dest=partner_rank, sendtag=data_tag, \ 
     recvbuf=data_receive, source=partner_rank, recvtag=data_tag, status=None) 

,但我得到當通信方法被調用的異常:

Traceback (most recent call last): 
    File "bipy.py", line 91, in <module> 
    bitonic_sort() 
File "bipy.py", line 72, in bitonic_sort 
    bitonic_merge(i, ixj, (i & k) == 0) 
File "bipy.py", line 51, in bitonic_merge 
    recvbuf=data_receive, source=partner_rank, recvtag=data_tag, status=None) 
File "Comm.pyx", line 166, in mpi4py.MPI.Comm.Sendrecv (src/mpi4py.MPI.c:58898) 
File "message.pxi", line 318, in mpi4py.MPI.message_p2p_send (src/mpi4py.MPI.c:21422) 
File "message.pxi", line 301, in mpi4py.MPI._p_msg_p2p.for_send (src/mpi4py.MPI.c:21285) 
File "message.pxi", line 111, in mpi4py.MPI.message_simple (src/mpi4py.MPI.c:19256) 
File "message.pxi", line 58, in mpi4py.MPI.message_basic (src/mpi4py.MPI.c:18509) 
KeyError: 'T{=l:f0:(54)b:f1:}' 

它適用於僅使用一種數據類型的數組(例如所有字節)。 MPI4Py無法發送這些結構化數組,或者我做錯了什麼?

+0

我認爲Sendrecv()函數只能發送一個類型的Numpy數組。你總是可以使用sendrecv()(小寫),它可以發送通用的python對象,但是會產生序列化開銷。 – 2012-07-11 14:52:25

回答

3

正如Jonathan Dursi在他的評論中已經提到的那樣:具有大寫字母的通信程序(例如Sendrecv())只能傳遞「存儲緩衝區」,即提供某個C API的數據結構。結構化數組似乎不是這樣的數據結構。 無論如何要發送它,請使用sendrecv()

請參閱MPI4Py文檔http://mpi4py.scipy.org/docs/usrman/mpi4py.html