Frage

Ich bin die Umsetzung in MPI ein Programm, in dem der Hauptprozess (mit Rang = 0) soll erhalten Anfragen von den anderen Prozessen der Lage sein, die für die Werte der Variablen stellen, die von der Wurzel nur bekannt ist. Wenn ich MPI_Recv (...) durch den Rang 0 machen, muss ich den Rang des Prozesses angeben, welche Anforderung an die Wurzel sendet, aber das kann ich nicht steuern, da die Prozesse laufen nicht in der Reihenfolge 1,2,3 , .... Wie kann ich die Anfrage von jedem Rang erhalten und nutzen Sie die Nummer des Emissionsprozesses ihm die notwendigen Informationen zukommen zu lassen?

War es hilfreich?

Lösung

Dies setzt voraus, Sie verwenden C. Es gibt ähnliche Konzepte in C ++ und Fortran. Sie würden nur MPI_ANY_SOURCE als Quelle in der MPI_recv() angeben. Der Status struct enthält die eigentliche Quelle der Nachricht.

int buf[32];
MPI_Status status;
// receive message from any source
MPI_recv(buf, 32, MPI_INT, MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, &status);
int replybuf[];
// send reply back to sender of the message received above
MPI_send(buf, 32, MPI_INT, status.MPI_SOURCE, tag, MPI_COMM_WORLD);

Andere Tipps

MPI_ANY_SOURCE ist die offensichtliche Antwort.

Wenn jedoch alle die Reihen einen Antrag auf Rang 0, dann MPI_Irecv kombiniert mit MPI_Testall auch als Muster funktionieren kann senden werden. Dies ermöglicht die MPI_Send Anrufe in beliebiger Reihenfolge ausgeführt werden, und die Informationen können in der Reihenfolge empfangen und verarbeitet werden, dass die MPI_Irecv Anrufe abgestimmt sind.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top