2013-07-19 5 views
7

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?

Antwort

14

Sie sind ein sehr wichtiger Teil fehlt, wie die in-Place-Reduktionsoperation arbeitet in MPI (siehe fett gedruckte Text):

Wenn der Kommunikator ist ein intracommunicator, können Sie führen eine Operation in- reduzieren place (der Ausgabepuffer wird als Eingabepuffer verwendet). Verwenden Sie die Variable MPI_IN_PLACE als Wert des Root-Prozessessendbuf. In diesem Fall werden die Eingabedaten im Stammverzeichnis aus dem Empfangspuffer genommen, wo sie durch die Ausgabedaten ersetzt werden.

Die anderen Prozesse haben immer noch ihre lokalen Puffer als sendbuf zu liefern, nicht MPI_IN_PLACE:

IF (me_world == 0) THEN 
    CALL mpi_reduce(MPI_IN_PLACE, buffer, counts, MPI_REAL, MPI_SUM, 0, MPI_COMM_WORLD, ierr) 
ELSE 
    CALL mpi_reduce(buffer, buffer, counts, MPI_REAL, MPI_SUM, 0, MPI_COMM_WORLD, ierr) 
END IF 

Sie sicher buffer als beide sendbuf und recvbuf in Nicht-Root-Prozesse passieren kann seit MPI_REDUCE nicht in recvbuf in diesen Prozessen schreiben.

+0

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

+0

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. –

+0

@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. –