In MPI
, gibt es keine eingebauten Mechanismus , eine Gruppe von Prozessen zu informieren , dass sie Nachrichten von anderen Prozessen empfangen müssen?
In meiner Anwendung muss jeder Prozess Daten an eine Gruppe von Prozessen mit bekannten Rang-IDs senden (die sich möglicherweise bei jeder Iteration ändern), sie kennen jedoch nicht den Rang der Prozesse, von denen Nachrichten empfangen werden. Gibt es eine tragbare, vorzugsweise integrierte Methode, um dies zu erreichen, ohne jeden einzelnen Prozess abzufragen?
MPI_Probe
wesentlich billiger alsMPI_Recv
?MPI_IProbe
Anrufe zu posten sind oder wie lange noch geprüft wird?Andere haben bereits die verschiedenen MPI_Probe-Varianten vorgeschlagen, aber ich möchte auf eines hinweisen: MPI ist kein Remoteprozeduraufruf, dh es gibt keine Möglichkeiten , einen Prozess zu benachrichtigen , dass eine Nachricht eingegangen ist (z. B. durch Auslösen eines Signals) ). Nachrichten werden gesendet, aber wenn der Empfangsprozess nicht nach ihnen sucht, passiert nichts. Daher lautet die Antwort auf Ihre Frage "Nein", aber ein Prozess kann aktiv herausfinden, ob eine Nachricht an ihn gesendet wurde.
quelle
http://mpitutorial.com/tutorials/dynamic-receiving-with-mpi-probe-and-mpi-status/ enthält ein Tutorial, das die Verwendung von MPI_Probe beschreibt, die für Sie nützlich sein könnte.
quelle
Wenn die Absender wissen, an wen sie senden, die Empfänger jedoch nicht wissen, von wem sie empfangen, senden Sie einfach Ihre Empfänge von MPI_ANY_SOURCE. Dadurch wird der Empfang mit jedem Prozess abgeglichen, der eine Nachricht an ihn sendet.
Wenn die Empfänger möglicherweise überhaupt nichts empfangen, können sie einen iRecv veröffentlichen. Immer wenn ein Prozess mit dem Senden seiner Nachrichten fertig ist, kann er am Ibarrier posten. Wenn der Ibarrier abgeschlossen ist, weil alle Prozesse ihn eingegeben haben (und MPI_WAIT für das Anforderungsobjekt aufgerufen haben), weiß jeder, dass die Kommunikation abgeschlossen ist, und kann seinen vorherigen Irecv abbrechen.
quelle