2 Stimmen

Fortran 90 und MPI Fehler

Ich schreibe ein sehr kleines Programm, um MPI (MPICH Implementierung) und Fortran 90 zu verstehen. Leider läuft der Code nicht richtig, wenn er mit "-np 2" ausgeführt wird.

Das ist der Code:

PROGRAM main
    USE MPI
    IMPLICIT none

    INTEGER :: ierr, npe, mynpe
    INTEGER :: istatus(MPI_STATUS_SIZE)
    REAL :: aa

    CALL MPI_INIT(ierr)
    CALL MPI_Comm_size(MPI_COMM_WORLD, npe, ierr)
    CALL MPI_Comm_rank(MPI_COMM_WORLD, mynpe, ierr)

    IF (mynpe == 0) THEN
        READ(*,*) aa
        CALL  MPI_Send(aa, 1, MPI_REAL, 1, 99, MPI_COMM_WORLD, ierr)
    ELSE IF (mynpe == 1) THEN
        CALL MPI_Recv(aa, 1, MPI_REAL, 0, 99, MPI_COMM_WORLD, istatus, ierr)
        WRITE(*,*) "Ich habe die Zahl erhalten ", aa
    END IF

    CALL MPI_FINALIZE(ierr)
END PROGRAM

Ich kompiliere es mit mpif90 mpi_2.f90 -o output und wenn ich es mit mpirun -np 2 output ausführe, erhalte ich folgenden Fehler:

At line 14 of file mpi_2.f90 (unit = 5, file = 'stdin')
Fortran runtime error: End of file

Die Shell wartet immer noch auf eine Eingabe und wenn ich eine Zahl (z.B. 11) eingebe, erhalte ich folgende Ausgabe:

11
Fatal error in MPI_Send: Invalid rank, error stack:
MPI_Send(173): MPI_Send(buf=0xbff4783c, count=1, MPI_REAL, dest=1, tag=99, MPI_COMM_WORLD) failed
MPI_Send(98).: Invalid rank has value 1 but must be nonnegative and less than 1
--------------------------------------------------------------------------
mpirun noticed that the job aborted, but has no info as to the process
that caused that situation.
--------------------------------------------------------------------------

Vielen Dank für die Hilfe!

7voto

Hristo Iliev Punkte 70306

Zwei verschiedene MPI-Implementierungen werden in Ihrem Fall gemischt. Die Laufzeitumgebung von MPI stammt aus einer anderen Implementierung als die, die zum Kompilieren des Programms verwendet wurde, und daher verhalten sich beide Prozesse wie MPI-Singletons, d.h. jeder von ihnen bildet einen separaten MPI_COMM_WORLD-Kommunikator und wird Rang 0 darin. Das Ergebnis ist, dass der erste Zweig der Bedingung in beiden Prozessen ausgeführt wird. Andererseits führt mpirun eine Eingabeumleitung nur zum ersten Prozess durch, während alle anderen ihre Standardeingabe geschlossen oder mit /dev/null verbunden haben. MPI_SEND schlägt aus dem gleichen Grund fehl - in der Einzeluniversum jedes MPI-Prozesses gibt es keinen Rang 1.

Die häufigste Ursache für dieses Verhalten ist, dass mpirun und mpif90 aus verschiedenen MPI-Bibliotheken stammen. In Ihrem Fall haben Sie MPICH mit Open MPI gemischt. Tatsächlich lautet die folgende Fehlermeldung:

MPI_Send(173): MPI_Send(buf=0xbff4783c, count=1, MPI_REAL, dest=1, tag=99, MPI_COMM_WORLD) failed
MPI_Send(98).: Invalid rank has value 1 but must be nonnegative and less than 1

hat das Fehlerformat von MPICH. Daher stammt mpif90 von MPICH.

Aber die nächste Fehlermeldung lautet:

--------------------------------------------------------------------------
mpirun hat festgestellt, dass der Job abgebrochen wurde, hat aber keine Informationen darüber, welcher Prozess
diese Situation verursacht hat.
--------------------------------------------------------------------------

hat das Fehlerformat des OpenRTE-Frameworks von Open MPI. Daher stammt mpirun von Open MPI und nicht von MPICH.

Dies könnte passieren, wenn Sie ein Entwicklerpaket für MPICH installiert haben, das also mpicc, mpif90 usw. bereitstellt, dann aber ein Laufzeitpaket für Open MPI installiert haben. Stellen Sie sicher, dass Sie nur Pakete von einer Art von MPI installiert haben. Wenn Sie MPICH aus Quellen kompiliert haben, stellen Sie sicher, dass der Pfad zu den Binärdateien darauf der erste Eintrag von $PATH ist.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X