Was ist eine effiziente Möglichkeit, MPI-Prozesse über den Empfang von Nachrichten zu benachrichtigen?


8

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?

Antworten:


7

Sie können versuchen, dass alle Prozessoren MPI_IProbe oder MPI_Probe mit MPI_ANY_SOURCE verwenden, um zu überprüfen, ob empfangene Nachrichten mit einem bestimmten Tag vorhanden sind. Wenn übereinstimmende Nachrichten vorhanden sind, können Sie den Absenderrang aus dem zurückgegebenen Status extrahieren und sofort MPI_Recv aufrufen.


Ist ein Anruf MPI_Probewesentlich billiger als MPI_Recv?
mmirzadeh

@GradGuy Mit MPI_IProbe und MPI_Probe erhalten Sie tatsächlich keine Nachrichten (Sie fragen nur MPI ab, um festzustellen, ob empfangene Nachrichten vorhanden sind). In diesem Sinne ist es wahrscheinlich billiger als MPI_Recv.
Matthew Emmett

@MatthewEmmett Woher weiß der Empfänger, wie viele MPI_IProbeAnrufe zu posten sind oder wie lange noch geprüft wird?
Shibli

12

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.


Theoretisch kann MPI_Probe vom Kernel so geplant werden, dass es bis zur Verwendung passiv ist. Dies unterscheidet sich nicht allzu sehr davon, wie IBM echte RPCs auf Blue Gene implementiert (bei denen das Betriebssystem und HW zusammenarbeiten, um sehr effiziente netzwerkinitiierte Interrupts zu implementieren, die aufgerufen werden können beliebige benutzerdefinierte Rückrufe). Natürlich macht keine Implementierung, die ich kenne, dies tatsächlich mit dem Blockieren von MPI-Anrufen ...
Jeff

1
Der Punkt, den ich ansprechen wollte, ist nicht so sehr die tatsächliche Implementierung, sondern das mentale Modell, das man haben sollte, wenn man über MPI nachdenkt. MPI ist ein rein passives Konzept: Sie können nicht auf Daten eines anderen Prozesses zugreifen. Sie können nicht erwarten, dass ein Signal ausgelöst wird, wenn eine eingehende Nachricht eintrifft. Alles passiert immer nur, wenn Sie aktiv eine Nachricht senden oder schauen, ob eine
eingegangen ist

Sie haben Recht mit einem Signal, aber RMA ermöglicht Ihnen den Zugriff auf entfernte Daten, und Implementierungen sollen passiven Fortschritt ermöglichen.
Jeff

1
Ja, Sie sprechen über das, was MPI 3 "einseitige Kommunikation" nennt. Das ist eine relativ neue Ergänzung und wahrscheinlich eine selten verwendete. Aber ich denke, es nimmt nichts von dem mentalen Modell, das ich oben dargelegt habe.
Wolfgang Bangerth

MPI 2.0 hatte vor zehn Jahren RMA und man kann zB put_with_notify mit diesen Funktionen implementieren. Ich bin damit einverstanden, dass MPI (noch) keine Remoteprozeduraufrufe (auch bekannt als aktive Nachrichten) hat, aber keine Nicht-IBM-Maschine implementiert diese ohne Abfrage. Daher sprechen wir nicht mehr wirklich über MPI, wenn wir die Notwendigkeit einer Abfrage kritisieren.
Jeff


1

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.


In welcher Reihenfolge erhält das die Nachricht? Ich muss das Absenderergebnis einer Berechnung
zurückschicken

Der Empfang erfolgt pro Sendevorgang. Wenn Rang 1 die Nachrichten A - B - C in dieser Reihenfolge sendet, kommen sie in dieser Reihenfolge an. Es gibt keine Garantie für die Reihenfolge zwischen den Prozessen.
Wesley Bland

Ich verstehe ... aber ist garantiert, dass die Nachrichten von Prozessen nicht miteinander vermischt werden?
mmirzadeh

Nein. Die Nachrichten zwischen Prozessen können in beliebiger Reihenfolge eintreffen.
Wesley Bland

3
MPI_Cancel ist eine schreckliche Funktion und sollte so selten wie möglich verwendet werden. Ich unterstütze stattdessen Varianten von Probe.
Jeff
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.