2012-07-11 17 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:}' 

これは、1つのデータ型(すべてのバイトなど)の配列を使用する場合に機能します。 MPI4Pyはこれらの構造化された配列を送信できませんか、何か間違っていますか?

+0

私はSendrecv()型の関数は、単一の型のNumpy配列しか送ることができないと思います。一般的なPythonオブジェクトを送ることができるsendrecv()(小文字)はいつでも使用できますが、シリアル化オーバーヘッドがあります。 –

答えて

3

Jonathan Dursiが既にコメントしたように、大文字の最初の文字(例:Sendrecv())の通信ルーチンは、「メモリバッファ」、つまり特定のC APIを提供するデータ構造のみを通信できます。構造化配列は、そのようなデータ構造ではないようです。 とにかく送信するには、sendrecv()を使用してください。

MPI4Pyドキュメントhttp://mpi4py.scipy.org/docs/usrman/mpi4py.htmlを参照してください。

関連する問題