I've just catched a problem with packing/unpacking using 'external32'
in Linux. The problem seems to be word ordering, I believe you forgot
to make the little-endian <-> big-endian conversion somewhere. Below,
an interactive session with ipython (sorry, no time to write in C)
showing the problem. Please, ignore me if this has been already
reported.

In [1]: import numpy

In [2]: from mpi4py import MPI

In [3]: print numpy.dtype('i').itemsize, MPI.INT.extent
4 4

In [4]: print numpy.dtype('b').itemsize, MPI.BYTE.extent
1 1

In [5]:

In [5]: arr1 = numpy.array([256], dtype='i') # one int, for input

In [6]: print arr1
[256]

In [7]: buf = numpy.array([0,0,0,0], dtype='b') # four bytes, auxiliar

In [8]: print buf
[0 0 0 0]

In [9]: p = MPI.INT.Pack_external('external32', arr1, buf, 0)

In [10]: print buf, repr(buf.tostring())
[0 1 0 0] '\x00\x01\x00\x00'

In [11]: arr2 = numpy.array([0], dtype='i') # one int, for output

In [12]: print arr2
[0]

In [13]: p = MPI.INT.Unpack_external('external32', buf, 0, arr2)

In [14]: print arr2
[65536]

In [15]: print arr2.byteswap()
[256]


--
Lisandro Dalcín
---------------
Centro Internacional de Métodos Computacionales en Ingeniería (CIMEC)
Instituto de Desarrollo Tecnológico para la Industria Química (INTEC)
Consejo Nacional de Investigaciones Científicas y Técnicas (CONICET)
PTLC - Güemes 3450, (3000) Santa Fe, Argentina
Tel/Fax: +54-(0)342-451.1594

Reply via email to