Ogni volta che provo a chiamare mpi_reduce
con mpi_in_place
come buffer di invio si blocca. Una rete di google rivela che si è verificato un problema su Mac OS per OMPI 1.3.3 - ma sono su CentOS con OMPI 1.6.3 (con gfortran 4.4.6).In posto mpi_reduce si blocca con OpenMPI
Il programma va in crash seguenti:
PROGRAM reduce
USE mpi
IMPLICIT NONE
REAL, DIMENSION(2, 3) :: buffer, gbuffer
INTEGER :: ierr, me_world
INTEGER :: buf_shape(2), counts
CALL mpi_init(ierr)
CALL mpi_comm_rank(mpi_comm_world, me_world, ierr)
buffer = 1.
IF (me_world .EQ. 0) PRINT*, "buffer: ", buffer
buf_shape = SHAPE(buffer)
counts = buf_shape(1)*buf_shape(2)
CALL mpi_reduce(MPI_IN_PLACE, buffer, counts, mpi_real, mpi_sum, 0, mpi_comm_world, ierr)
IF (me_world .EQ. 0) PRINT*, "buffer: ", buffer
CALL mpi_finalize(ierr)
END PROGRAM reduce
L'errore MPI è:
MPI_ERR_ARG: invalid argument of some other kind
, che non è molto utile.
Mi manca qualcosa su come chiamare mpi_reduce
? Funziona con altri compilatori/implementazioni MPI?
Grazie, è stato risolto! Ho interpretato erroneamente la documentazione di 'MPI_IN_PLACE' perché pensavo che le comunicazioni collettive dovevano essere chiamate da tutti i processi con esattamente gli stessi argomenti. – Yossarian
Oops, sei proprio sicuro? Ho appena esaminato il mio codice di produzione e ho molti esempi di utilizzo errato e non ho riscontrato alcun problema finora. –
@VladimirF, ci sono alcune operazioni collettive in cui 'MPI_IN_PLACE' deve essere specificato come buffer di invio da tutti i ranghi, ad esempio' MPI_ALLTOALL' o 'MPI_ALLREDUCE'. Lo standard elenca l'uso corretto per ogni operazione separatamente. –