2012-07-11 67 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