Ist MPI_Reduce blockiert (oder eine Natürliche Barriere)?
Habe ich das code-snippet unten in C++ die im Grunde berechnet die pi mit Hilfe der klassischen monte-carlo-Technik.
srand48((unsigned)time(0) + my_rank);
for(int i = 0 ; i < part_points; i++)
{
double x = drand48();
double y = drand48();
if( (pow(x,2)+pow(y,2)) < 1){ ++count; }
}
MPI_Reduce(&count, &total_hits, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD);
MPI_Barrier(MPI_COMM_WORLD);
if(my_rank == root)
{
pi = 4*(total_hits/(double)total_points);
cout << "Calculated pi: " << pi << " in " << end_time-start_time << endl;
}
Ich Frage mich nur, wenn der call MPI_Barrier notwendig ist. Tut MPI_Reduce stellen Sie sicher, dass der Körper der if-Anweisung nicht ausgeführt werden, bevor die Reduzierung der Vorgang komplett beendet ist ? Hoffe, ich war klar. Dank
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ja, alle kollektiven Kommunikation Anrufe (Reduzieren, Streuen, Sammeln, etc) blockieren. Es gibt keine Notwendigkeit für die Barriere.
MPI_Barrier
.Blockieren ja, eine Barriere, Nein. Es ist sehr wichtig zu nennen
MPI_Barrier()
fürMPI_Reduce()
beim ausführen in eine Endlosschleife geraten. Wenn nicht ruftMPI_Barrier()
den Empfangspuffer der Reduzierung der Prozess schließlich läuft voll und die Anwendung wird abgebrochen. Während die anderen beteiligten Prozesse brauchen nur zu senden, und weiterhin, die Verringerung der Prozess hat zu empfangen und zu reduzieren.Der obige code muss nicht die Barriere, wenn
my_rank == root == 0
(was wohl wahr ist). Anyways...MPI_Reduce()
führt nicht zu einer Barriere oder eine andere form der Synchronisation. AFAIK sogarMPI_Allreduce()
ist nicht garantiert, um zu synchronisieren (zumindest nicht von der MPI-standard).Fragen Sie Ihren selbst, wenn diese Barriere ist erforderlich. Angenommen, Sie sind nicht die Wurzel; Sie rufen Reduzieren, die sendet Ihre Daten. Gibt es einen Grund, zu sitzen und zu warten bis der root hat das Ergebnis? Antwort: Nein, so brauchen Sie nicht die Barriere.
Nehme an, du hast root. Sie geben zu reduzieren nennen. Semantisch sind Sie nun gezwungen zu sitzen und zu warten, bis das Ergebnis vollständig zusammengebaut ist. Also warum die Sperre? Wieder, keine Barriere Aufruf erforderlich ist.
Im Allgemeinen, die Sie fast nie brauchen eine Barriere, denn Sie kümmern sich nicht um die zeitliche Synchronisation. Die Semantik garantieren, dass Ihre lokale Staat ist richtig, nach dem reduzieren rufen.