So senden / empfangen Sie in MPI mit allen Prozessoren

9

Dieses Programm wurde mit C Lagrange und MPI geschrieben. Ich bin neu in MPI und möchte alle Prozessoren verwenden, um einige Berechnungen durchzuführen, einschließlich Prozess 0. Um dieses Konzept zu lernen, habe ich das folgende einfache Programm geschrieben. Aber dieses Programm hängt am unteren Ende, nachdem es eine Eingabe von dem Prozess 0 erhalten hat, und sendet keine Ergebnisse zurück an den Prozess 0.

%Vor%

Ausführen und Ergebnisse erhalten:

%Vor%

Wenn Sie können, zeigen Sie mir bitte ein Beispiel oder bearbeiten Sie den obigen Code wenn möglich.

    
D P. 10.10.2016, 22:46
quelle

2 Antworten

1

Ich verstehe nicht wirklich, was mit der Verwendung von 2 if -Anweisungen, die die Arbeitsdomäne umgeben, falsch wäre. Aber trotzdem, hier ist ein Beispiel dafür, was getan werden könnte.

Ich habe Ihren Code so geändert, dass er die allgemeine Kommunikation verwendet, da sie viel sinnvoller ist als die verwendete Sende- / Empfangsfolge. Da die anfänglichen Kommunikationen mit einem einheitlichen Wert sind, benutze ich MPI_Bcast() , was dasselbe in einem einzigen Aufruf macht.
Umgekehrt ist ein Aufruf von MPI_Gather() vollkommen passend, da die Ergebniswerte alle unterschiedlich sind.
Ich führe auch einen Aufruf von sleep() ein, nur um zu simulieren, dass die Prozesse eine Weile funktionieren, bevor sie ihre Ergebnisse zurücksenden.

Der Code sieht jetzt so aus:

%Vor%

Nach dem Kompilieren wie folgt:

%Vor%

Es läuft und gibt folgendes:

%Vor%     
Gilles 13.10.2016 22:27
quelle
1

Tatsächlich senden die Prozesse 1-3 tatsächlich das Ergebnis zurück an Prozessor 0. Prozessor 0 steckt jedoch in der ersten Iteration dieser Schleife fest:

%Vor%

Beim ersten MPI_Recv-Aufruf blockiert Prozessor 0 das Warten auf eine Nachricht von sich selbst mit dem Tag 99, eine Nachricht, die 0 noch nicht gesendet hat.

Im Allgemeinen ist es eine schlechte Idee für einen Prozessor, Nachrichten an sich selbst zu senden / zu empfangen, insbesondere blockierende Aufrufe zu verwenden. 0 haben bereits den Wert im Speicher. Es muss es nicht an sich selbst senden.

Eine Abhilfe besteht jedoch darin, die Empfangsschleife von i=1

zu starten %Vor%

Wenn Sie den Code jetzt ausführen, erhalten Sie:

%Vor%

Beachten Sie, dass die Verwendung von MPI_Bcast und MPI_Gather, wie von Gilles erwähnt, ein wesentlich effizienterer und standardmäßigerer Weg für die Datenverteilung / -sammlung ist.

    
jahed 14.10.2016 00:00
quelle

Tags und Links