Quelqu'un peut-il me dire pourquoi cet exemple de travail minimal (MWE) se plaint de TypeError: expected a writeable buffer object
?MPI4Py provoque une erreur sur l'envoi/recv
MWE:
#!/usr/bin/env python
from mpi4py import MPI
# MPI Initialization
rank = MPI.COMM_WORLD.Get_rank()
comm = MPI.COMM_WORLD
if __name__ == '__main__':
a = True
if rank == 0:
a = False
comm.Send ([ a, MPI.BOOL ], 1, 111)
if rank == 1:
comm.Recv ([ a, MPI.BOOL], 0, 111)
Erreur:
Traceback (most recent call last):
File "test.py", line 14, in <module>
comm.Recv ([ a, MPI.BOOL], 0, 111)
File "Comm.pyx", line 143, in mpi4py.MPI.Comm.Recv (src/mpi4py.MPI.c:62980)
File "message.pxi", line 323, in mpi4py.MPI.message_p2p_recv (src/mpi4py.MPI.c:22814)
File "message.pxi", line 309, in mpi4py.MPI._p_msg_p2p.for_recv (src/mpi4py.MPI.c:22665)
File "message.pxi", line 111, in mpi4py.MPI.message_simple (src/mpi4py.MPI.c:20516)
File "message.pxi", line 51, in mpi4py.MPI.message_basic (src/mpi4py.MPI.c:19644)
File "asbuffer.pxi", line 108, in mpi4py.MPI.getbuffer (src/mpi4py.MPI.c:6757)
File "asbuffer.pxi", line 48, in mpi4py.MPI.PyObject_GetBufferEx (src/mpi4py.MPI.c:6081)
TypeError: expected a writeable buffer object
Traceback (most recent call last):
File "test.py", line 12, in <module>
comm.Send ([ a, MPI.BOOL ], 1, 111)
File "Comm.pyx", line 132, in mpi4py.MPI.Comm.Send (src/mpi4py.MPI.c:62796)
File "message.pxi", line 318, in mpi4py.MPI.message_p2p_send (src/mpi4py.MPI.c:22744)
File "message.pxi", line 301, in mpi4py.MPI._p_msg_p2p.for_send (src/mpi4py.MPI.c:22604)
File "message.pxi", line 111, in mpi4py.MPI.message_simple (src/mpi4py.MPI.c:20516)
File "message.pxi", line 51, in mpi4py.MPI.message_basic (src/mpi4py.MPI.c:19644)
File "asbuffer.pxi", line 108, in mpi4py.MPI.getbuffer (src/mpi4py.MPI.c:6757)
File "asbuffer.pxi", line 50, in mpi4py.MPI.PyObject_GetBufferEx (src/mpi4py.MPI.c:6093)
===================================================================================
= BAD TERMINATION OF ONE OF YOUR APPLICATION PROCESSES
= EXIT CODE: 1
= CLEANING UP REMAINING PROCESSES
= YOU CAN IGNORE THE BELOW CLEANUP MESSAGES
===================================================================================
[proxy:0:[email protected]] HYD_pmcd_pmip_control_cmd_cb (./pm/pmiserv/pmip_cb.c:886): assert (!closed) failed
[proxy:0:[email protected]] HYDT_dmxu_poll_wait_for_event (./tools/demux/demux_poll.c:77): callback returned error status
[proxy:0:[email protected]] main (./pm/pmiserv/pmip.c:206): demux engine error waiting for event
[[email protected]] HYDT_bscu_wait_for_completion (./tools/bootstrap/utils/bscu_wait.c:76): one of the processes terminated badly; aborting
[[email protected]] HYDT_bsci_wait_for_completion (./tools/bootstrap/src/bsci_wait.c:23): launcher returned error waiting for completion
[[email protected]] HYD_pmci_wait_for_completion (./pm/pmiserv/pmiserv_pmci.c:217): launcher returned error waiting for completion
[[email protected]] main (./ui/mpich/mpiexec.c:331): process manager error waiting for completion
Votre code problématique diffère dans vos 2 exemples. 'comm.Send ([a, MPI.BOOL], 1, 111)' par rapport à '# comm.Send ([a, MPI.BOOL], dest = 1, tag = 111)' les étiquettes de champ corrigent-elles votre problème? – kraffenetti
Cela pourrait être pourquoi. Notez que j'ai utilisé 'send' d'abord et il s'est écrasé, puis' Send' s'est écrasé, puis je suis retourné à 'send' et cela a fonctionné. Je suppose que les étiquettes de terrain ** sont ** ce qui a fait la différence. Permettez-moi de double contrôle – puk
@kraffenetti Je viens d'essayer à nouveau en utilisant les versions supérieures de cas'Envoie/Recv', et je fixe le '' dest' à source' dans la deuxième ligne a commenté, et je ** toujours ** obtenu le même erreur – puk