OpenMPI MPI_Barrier Probleme

7

Ich habe einige Synchronisationsprobleme mit der OpenMPI-Implementierung von MPI_Barrier:

%Vor%

für mpirun -n 2 ./a.out

Ausgabe sollte sein: P0 P1 ...

Ausgabe ist manchmal : P0 P0 nochmal P1 P1 wieder

was ist los?

    
hola 03.03.2011, 14:30
quelle

3 Antworten

13

Die Reihenfolge, in der Ihre Ausdruckzeilen auf Ihrem Terminal erscheinen, ist nicht unbedingt die Reihenfolge, in der die Artikel gedruckt werden. Sie verwenden dafür eine freigegebene Ressource ( stdout ), daher muss immer ein Bestellproblem vorliegen. (Und fflush hilft hier nicht, stdout ist sowieso liniengepuffert.)

Sie könnten versuchen, Ihre Ausgabe mit einem Zeitstempel zu versehen und das alles in verschiedenen Dateien zu speichern, eine pro MPI-Prozess.

Um das Protokoll zu überprüfen, könnten Sie die beiden Dateien zusammenführen und nach dem Zeitstempel sortieren.

Dein Problem sollte dann verschwinden.

    
Jens Gustedt 03.03.2011, 16:33
quelle
10

Mit MPI_Barrier () ist nichts falsch.

Jens erwähnt , der Grund, warum Sie die Ausgabe nicht sehen Sie erwartet, weil Stdout bei jedem Prozess gepuffert ist. Es gibt keine Garantie, dass Abzüge von mehreren Prozessen im aufrufenden Prozess der Reihe nach angezeigt werden. (Wenn stdout von jedem Prozess zum Hauptprozess zum Drucken in Echtzeit übertragen wird, führt dies zu einer Menge unnötiger Kommunikation!)

Wenn Sie sich davon überzeugen möchten, dass die Barriere funktioniert, können Sie stattdessen versuchen, in eine Datei zu schreiben. Wenn mehrere Prozesse in eine einzelne Datei schreiben, kann dies zu zusätzlichen Komplikationen führen, so dass jeder proc in eine Datei schreiben kann und dann nach der Barriere die Dateien, auf die sie schreiben, austauscht. Zum Beispiel:

%Vor%

Beispielimplementierung:

%Vor%

Nach dem Ausführen des Codes sollten Sie folgende Ergebnisse erhalten:

%Vor%

Bei allen Dateien erscheinen die "after-Barrier" -Anweisungen immer später.

    
Shawn Chin 03.03.2011 17:38
quelle
3

Die Ausgabefolge ist in MPI-Programmen nicht garantiert.

Das hängt überhaupt nicht mit MPI_Barrier zusammen.

Außerdem würde ich nicht zu viel Zeit darauf verwenden, mir Sorgen über die Ausgabebestellung mit MPI-Programmen zu machen.

Der eleganteste Weg, dies zu erreichen, ist, wenn Sie wirklich wollen, dass die Prozesse ihre Nachrichten an einen Rang, sagen wir, Rang 0 senden und der Rang 0 die Ausgabe in der Reihenfolge drucken soll, in der sie empfangen oder geordnet wurden Ränge.

Auch hier sollten Sie nicht zu viel Zeit darauf verwenden, die Ausgabe von MPI-Programmen zu bestellen. Es ist nicht praktisch und nützt wenig.

    
powerrox 03.03.2011 22:42
quelle

Tags und Links