Ich habe eine Reihe von MPI-Prozessen, die Anforderungsnachrichten hin und her austauschen. Prozesse wissen nicht, welche anderen Prozesse ihnen Nachrichten senden oder wie viele. In dieser Situation möchte ich auf effiziente Weise feststellen, ob alle anderen Prozesse das Senden von Nachrichten für erledigt halten.
Dies würde perfekt durch die folgende nicht blockierende Version von MPI_Barrier erreicht, die wir MPI_Ibarrier nennen werden:
int MPI_Ibarrier(MPI_Comm comm, MPI_Request* request);
MPI_Ibarrier
würde sofort zurückkehren, und Standardoperationen für das Anforderungsobjekt würden uns wissen lassen, wenn die Barriere von allen erreicht wurde.
Gibt es eine Möglichkeit, dieses Verhalten in MPI 2 effizient zu simulieren (dh ohne offizielle nicht blockierende Kollektive)?
Antworten:
Bemerkenswerterweise
MPI_Ibarrier
ist dies eine sehr nützliche Routine. Sie können beispielsweise eine unstrukturierte Runde von Nachrichten an Ränge senden, die nicht wissen, wie viele Nachrichten empfangen werden sollen, indem Sie mit sendenMPI_Issend
(ja, eine seltene Verwendung des synchronen Sendens ) und dann eine abwechselnde Schleife eingebenMPI_Testall
(um zu sehen, ob die Sendungen abgeschlossen sind). undMPI_Iprobe
(um eingehende Nachrichten zu verarbeiten). Wenn der Sendevorgang abgeschlossen ist, veröffentlichen SieMPI_Ibarrier
die Barriere und testen sie alternativ auf eingehende Nachrichten. Torsten Hoefler hat ein Papier dazu, in dem er die Optimalität der Kommunikation unter Beweis stellt, siehe Algorithmus 2: http://unixer.de/publications/img/hoefler-dsde-protocols.pdfBeachten Sie, dass eine Barriere nicht sicherstellt, dass Punkt-zu-Punkt-Nachrichten oder andere nicht blockierende Kollektive, die vor Abschluss der Barriere veröffentlicht wurden, abgeschlossen sind. Wenn Sie möchten, dass sie abgeschlossen sind, müssen Sie sicherstellen, dass sie abgeschlossen sind, bevor Sie die Barriere veröffentlichen. Wie Bill sagt, ist (Blockieren)
MPI_Barrier
in den meisten Fällen falsch / unnötig. Eine Ausnahme ist die Kommunikation über Seitenkanäle wie das Dateisystem.Obwohl es keine ähnlich performante Möglichkeit gibt,
MPI_Ibarrier
mit MPI-2 zu simulieren , bietet MPICH2MPIX_Ibarrier
im 1,5-Zweig (Strom). Lieferantennetzwerke unterstützen diese Vorgänge im Allgemeinen, sodass die Lieferantenimplementierungen (die im Allgemeinen von MPICH2 abgeleitet sind) nur eine Schnittstelle benötigen. Sobald ihre Patches auf 1.5MPI_Ibarrier
verschoben werden, sollten andere nicht blockierende Kollektive unterstützt werden. Der Open MPI-Entwicklungszweig hat eine ImplementierungMPI_Ibarrier
basierend auf libNBC.quelle
Siehe http://www.unixer.de/research/nbcoll/ , insbesondere http://www.unixer.de/research/nbcoll/libnbc/ , die Referenzimplementierung, die über MPI-1 liegt. Wie Jed sagte, hat MPICH2 1.5 bereits NBC und die Implementierung ähnelt der von Torsten (obwohl dies aufgrund des geringeren Overheads mit ziemlicher Sicherheit schneller ist).
quelle