2012-07-11 8 views
5

Estoy tratando de enviar y recibir datos en MPI4Py, usando la matriz estructurada de NumPy. La siguiente es la estructura de mi matriz:Enviar y recibir datos de matriz estructurados en MPI4Py usando NumPy

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

y estoy usando el método sendrecv para el intercambio de los datos, de la siguiente manera:

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

pero me da una excepción cuando se llama al método de comunicación:

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

Funciona cuando se utiliza una matriz con un solo tipo de datos (todos los bytes, por ejemplo). ¿MPI4Py no puede enviar estas matrices estructuradas, o estoy haciendo algo mal?

+0

Creo que las funciones de tipo Sendrecv() solo pueden enviar matrices Numpy de un solo tipo. Siempre puede usar sendrecv() (minúscula) que puede enviar objetos python genéricos, pero luego tendrá la sobrecarga de serialización. –

Respuesta

3

Como ya se ha mencionado por Jonathan Dursi en su comentario: las rutinas de comunicación con primera letra mayúscula (por ejemplo Sendrecv()) sólo puede comunicarse "buffers de memoria", es decir, estructuras de datos que proporcionan una cierta API C. Las matrices estructuradas no parecen ser una estructura de datos. Para enviarlo de todos modos, use sendrecv().

Consulte en los documentos MPI4Py en http://mpi4py.scipy.org/docs/usrman/mpi4py.html.

Cuestiones relacionadas