2012-07-11 9 views
5

Sto tentando di inviare e ricevere dati in MPI4Py, utilizzando l'array strutturato di NumPy. Quanto segue è la mia struttura a matrice:Invio e ricezione di dati di array strutturati in MPI4Py utilizzando NumPy

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

e sto usando il metodo sendrecv per lo scambio dei dati, come segue:

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

ma ottengo un'eccezione quando il metodo di comunicazione si chiama:

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

Funziona quando si utilizza un array con un solo tipo di dati (tutti i byte, ad esempio). MPI4Py non è in grado di inviare questi array strutturati o sto facendo qualcosa di sbagliato?

+0

Penso che le funzioni di tipo Sendrecv() possano solo inviare matrici Numpy di un singolo tipo. Puoi sempre usare sendrecv() (in minuscolo) che può inviare oggetti Python generici, ma poi avrai il sovraccarico di serializzazione. –

risposta

3

Come già accennato da Jonathan Dursi nel suo commento: le routine di comunicazione con lettera maiuscola (ad esempio Sendrecv()) possono comunicare solo "buffer di memoria", ovvero strutture di dati che forniscono una determinata API C. Gli array strutturati non sembrano essere una tale struttura di dati. Per inviarlo comunque, utilizzare sendrecv().

Vedere i documenti MPI4Py allo http://mpi4py.scipy.org/docs/usrman/mpi4py.html.