Immer wenn ich versuche, mpi_reduce
mit mpi_in_place
als Sendepuffer aufrufen, stürzt es ab. Ein Trawl von Google zeigt, dass dies ein Problem unter Mac OS für OMPI 1.3.3 war - aber ich bin auf CentOS mit OMPI 1.6.3 (mit gfortran 4.4.6).An Ort und Stelle mpi_reduce stürzt mit OpenMPI
Folgende Programmabstürze:
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
Der MPI-Fehler ist:
MPI_ERR_ARG: invalid argument of some other kind
, die nicht sehr hilfreich ist.
Fehle ich etwas, wie mpi_reduce
sollte aufgerufen werden? Funktioniert das mit anderen Compilern/MPI-Implementierungen?
Danke, das hat es behoben! Ich habe die Dokumentation "MPI_IN_PLACE" falsch interpretiert, da ich dachte, dass kollektive Kommunikation von allen Prozessen mit genau denselben Argumenten aufgerufen werden musste. – Yossarian
Ups, bist du dir wirklich sicher? Ich habe mir nur meinen Produktionscode angeschaut und ich habe viele Fälle falsch benutzt und ich habe bisher kein Problem gefunden. –
@VladimirF, gibt es einige kollektive Operationen, bei denen 'MPI_IN_PLACE' als Sendepuffer von allen Rängen angegeben werden muss, z. B.' MPI_ALLTOALL' oder 'MPI_ALLREDUCE'. Der Standard listet die ordnungsgemäße Verwendung für jede Operation separat auf. –