Anmutig Ausfahrt mit MPI
Ich versuche ohne Fehler zu beenden mein Programm nach, ob Rdinput einen Fehler zurück.
#include <mpi.h>
#include <stdio.h>
#include <stdlib.h>
#define MASTER 0
#define Abort(x) MPI_Abort(MPI_COMM_WORLD, x)
#define Bcast(send_data, count, type) MPI_Bcast(send_data, count, type, MASTER, GROUP) //root --> MASTER
#define Finalize() MPI_Finalize()
int main(int argc, char **argv){
//Code
if( rank == MASTER ) {
time (&start);
printf("Initialized at %s\n", ctime (&start) );
//Read file
error = RdInput();
}
Bcast(&error, 1, INT); Wait();
if( error = 1 ) MPI_Abort(1);
//Code
Finalize();
}
Programm-Ausgabe:
mpirun -np 2 code.x
--------------------------------------------------------------------------
MPI_ABORT was invoked on rank 0 in communicator MPI_COMM_WORLD
with errorcode 1.
NOTE: invoking MPI_ABORT causes Open MPI to kill all MPI processes.
You may or may not see output from other processes, depending on
exactly when Open MPI kills them.
--------------------------------------------------------------------------
Initialized at Wed May 30 11:34:46 2012
Error [RdInput]: The file "input.mga" is not available!
--------------------------------------------------------------------------
mpirun has exited due to process rank 0 with PID 7369 on
node einstein exiting improperly. There are two reasons this could occur:
//More error message.
Was kann ich tun, um würdevoll beenden Sie ein MPI-Programm ohne den Druck dieses riesige Fehlermeldung?
Wo habt Ihr Sie versteckt mpi_init ?
Alle code, den Sie geteilt haben, ist irrelevant für das problem. Alle der code, der relevant ist für das problem fehlt. Wir wissen nicht, wie Sie Sie initialisieren oder MPI finalize, und wir wissen gar nicht, wo
Ein völlig off-topic-Vorschlag: Betrachten fallen die großen banner. Man könnte einen Schalter wie
Das banner ist ziemlich üblich, am Beginn der wissenschaftlichen software, insbesondere, wenn er druckt-version zahlen oder details ausführen, damit diese Informationen werden dann gespeichert in der Ausgabe des Programms.
Alle code, den Sie geteilt haben, ist irrelevant für das problem. Alle der code, der relevant ist für das problem fehlt. Wir wissen nicht, wie Sie Sie initialisieren oder MPI finalize, und wir wissen gar nicht, wo
rank
definiert ist, oder, wie Sie füllen Sie es. Gerade jetzt, es sieht aus wie MPI ist noch nie initialisiert.Ein völlig off-topic-Vorschlag: Betrachten fallen die großen banner. Man könnte einen Schalter wie
--help
und die Liste der Autoren, wenn Sie drucken, Hilfe, Informationen, oder Sie können die Liste der Autoren, die in der man
Seite für Ihr Programm. Kann jemand wollen, verwenden Sie die Ausgabe Ihres Programms in ein script, und das banner wird sein ein Schmerz im Nacken, dann. Als ein Beispiel, stellen Sie sich vor, was passieren würde, wenn die cat
Programm gestartet, indem Sie ein banner drucken, Wann immer Sie Sie bitten, es zu cat
eine Datei.Das banner ist ziemlich üblich, am Beginn der wissenschaftlichen software, insbesondere, wenn er druckt-version zahlen oder details ausführen, damit diese Informationen werden dann gespeichert in der Ausgabe des Programms.
InformationsquelleAutor Fabricio | 2012-05-30
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie diese Logik in Ihren code:
dann sind Sie fast fertig (obwohl Sie nicht brauchen, jede Art von warten, nachdem eine broadcast). Der trick, wie Sie entdeckt haben, ist, dass
MPI_Abort()
hat nicht tun "anmutig"; es ist im Grunde da, um Dinge Herunterfahren in welcher Weise auch immer möglich, wenn etwas schrecklich falsch gegangen.In diesem Fall, da jetzt alle einig sind, der auf der Fehler-code nach der Sendung, nur tun, eine anmutige Ende Ihres Programms:
Es ist ein Fehler zu nennen
MPI_Finalize()
und halten Sie sich mit mehr MPI-Zeug, aber das ist nicht das, was du hier tust, so bist du gut.In diesem Fall, nicht alle MPI-Prozesse bekam die Finalize - /Ausfahrt zur gleichen Zeit an anderer Stelle. Es sollte nicht notwendig sein, aber stellen eine Barriere nach der Sendung und sehen, ob es nur eine Frage von ein bisschen out of sync oder einige Prozesse wirklich sind irgendwo hängen geblieben.
Es sollte ein Semikolon am Ende der Zeile fprintf.
Danke, @JC1. Behoben.
InformationsquelleAutor Jonathan Dursi