MPI-Spawn: Der Root-Prozess kommuniziert nicht mit untergeordneten Prozessen

8

(Anfängerfrage) Ich versuche, Prozesse dynamisch mit MPI_Comm_Spawn zu erzeugen und dann eine Nachricht an die Kindprozesse zu senden, aber das Programm stoppt in der Übertragung vom Stammprozess zu den Kindern. Ich folge der Dokumentation von Ссылка , aber ich kann es nicht funktionieren lassen. Kann mir bitte jemand helfen?

%Vor%

Ich weiß nicht, ob es wichtig ist, aber ich benutze ubuntu 11.10 und Hidra Process Manager.

    
Flamínio Maranhão 02.04.2012, 03:01
quelle

3 Antworten

3

Wie @suszterpatt darauf hingewiesen hat, arbeiten Sie mit einem "Intercommunicator" (kein "Intracommunicator"). Wenn wir das wissen und MPI_Bcast sehen, sehen wir:

  

Wenn comm ein Interkommunikator ist, umfasst der Aufruf alle Prozesse im Interkommunikator, wobei jedoch eine Gruppe (Gruppe A) den Root-Prozess definiert. Alle Prozesse in der anderen Gruppe (Gruppe B) übergeben den gleichen Wert im Argument root. Dies ist der Rang des Stamms in Gruppe A. Der Stamm übergibt den Wert MPI_ROOT im Stamm. Alle anderen Prozesse in Gruppe A übergeben den Wert MPI_PROC_NULL in root. Daten werden vom Stamm an alle Prozesse in Gruppe B gesendet. Die Empfangspufferargumente der Prozesse in Gruppe B müssen mit dem Sendepufferargument des Stamms übereinstimmen.

Dies bedeutet, dass Sie nur den Broadcast-Anruf im übergeordneten Element ersetzen müssen:

%Vor%

Ein paar andere Fehler:

  • Die Überprüfung der Anzahl der Argumente sollte argc > 1 sein.
  • MPI_Comm_size(intercomm, &size) gibt 1 zurück. Sie sollten stattdessen MPI_Comm_remote_size(intercomm, &size) verwenden.
bfroehle 21.08.2012 16:15
quelle
2

Wenn Sie nicht mit einem Interkommunikator arbeiten möchten, nachdem Sie Ihre untergeordneten Prozesse erstellt haben, können Sie % co_de verwenden % , um einen Intra-Communicator von Ihrem Interkommunikator zu erstellen. Im Wesentlichen würde es so aussehen:

Spawner:

%Vor%

Spawnee:

%Vor%

Danach können Sie weiterhin MPI_Intercomm_merge (oder wie immer Sie es nennen wollen) verwenden, als wäre es ein normaler Intra-Communicator. In diesem Fall hätten die Laichprozesse die Ränge niedriger Ordnung und die neuen Prozesse hätten die höheren Ränge, aber Sie können dies auch mit dem zweiten Argument ändern.

    
Wesley Bland 21.08.2013 13:21
quelle
-1

Kollektive Kommunikationsanrufe wie Bcast() erfordern einen Intra-Communicator: Sie versuchen, einen Interkommunikator zu verwenden (sowohl intercomm als auch parentcomm ). Sie müssen die Methoden zur Gruppenerstellung verwenden, um eine Gruppe zu definieren, die den übergeordneten Prozess und alle untergeordneten Prozesse umfasst, und anschließend einen neuen Intra-Communicator für diese Gruppe erstellen.

    
suszterpatt 03.04.2012 13:29
quelle

Tags und Links