2012-07-11 5 views
5

Ich versuche, Daten in MPI4Py zu senden und zu empfangen, mit dem strukturierten Array von NumPy. Im Folgenden ist meine Array-Struktur:Senden und Empfangen von strukturierten Array-Daten in MPI4Py mit NumPy

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

und ich die sendrecv Methode verwende die Daten für den Austausch wie folgt:

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

Aber ich eine Ausnahme erhalten, wenn die Kommunikation Methode aufgerufen wird:

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:}' 

Es funktioniert, wenn nur mit einem Datentyp (alle Bytes, zum Beispiel) ein Array verwendet wird. Kann MPI4Py diese strukturierten Arrays nicht senden oder mache ich etwas falsch?

+0

ich denke, die sendrecv() - Typ-Funktionen nur Numpy Arrays von einer einzigen Art senden. Sie können immer sendrecv() (Kleinbuchstaben) verwenden, die generische Python-Objekte senden können, aber dann haben Sie den Serialisierungs-Overhead. –

Antwort

3

Wie bereits von Jonathan Dursi in seinem Kommentar erwähnt: die Kommunikationsroutinen mit Großbuchstaben (z. B. Sendrecv()) können nur "Speicherpuffer" kommunizieren, d.h. Datenstrukturen, die eine bestimmte C-API bereitstellen. Strukturierte Arrays scheinen keine solche Datenstruktur zu sein. es sowieso, verwenden sendrecv() zu senden.

Siehe in der MPI4Py docs bei http://mpi4py.scipy.org/docs/usrman/mpi4py.html.