2016-09-12 5 views
0

Also schreibe ich ein Programm, um einen "virtuellen Ball" zwischen Prozessen zu hüpfen. Der Stammprozess, d. H. Die Aufgabe mit Rang 0, initialisiert das Spiel und sendet es dann an einen zufälligen Prozess, der durch rand() % size bestimmt wird (wobei die durch den anfänglichen Rang gesetzte Zufallszahl erzeugt wird).Senden an und Empfangen von verschiedenen Prozessen in MPI

Ich habe zu tun versucht:

int rnk= rand() % size; MPI_Send(&ball,1, MPI_INT, rnk, MPI_COMM_WORLD);

Diese den Ball zum nächsten zufälligen Prozess sendet aber diese den Code beim Fahren wird durch die Blockierung MPI_Send gehalten. Ich habe gerade mit der parallelen Programmierung begonnen, daher habe ich nicht genug Verständnis dafür. Wie sende ich einen zufälligen Prozess und sende ihn dann an einen beliebigen Prozess weiter?

Alle Hinweise, Tipps, Bücher und Tutorials sind willkommen.

+2

Bitte geben Sie eine [mcve] von dem, was Sie versucht haben. – Zulan

+1

Siehe http://stackoverflow.com/questions/4348900/mpi-recv-from-an-unknown-source – francis

+0

Okay, das Problem war, dass einer der MPI-Prozesse wegen einer Wettlaufsituation hängen blieb. Ich habe das gelöst und das Programm lief wie erwartet. –

Antwort

0

Sie können MPI_Recv mit MPI_ANY_SOURCE als Quelle verwenden (siehe Kommentar von francis).

Stellen Sie sicher, dass Sie zuerst MPI_Recv in allen Prozessen außer dem Stamm anrufen, der zuerst gesendet werden muss.

1

Es gibt ein Problem hier, wenn der Stamm zunächst versucht, an sich selbst zu senden (was passieren kann, da rand()% Größe könnte Null sein).

  • Wenn Sie den Empfang zuerst an die Wurzel senden, wird er blockiert, da er nie zum Sendeaufruf gelangt (wie von @Gregor oben gezeigt);
  • jedoch, wenn Sie das Senden zuerst auf dem Stamm, dann gibt es keine Garantie, dass es jemals auf den Empfangsaufruf als MPI_Send() nicht wird garantiert asynchron (dh es könnte als eine synchrone send implementiert werden was ewig auf einen passenden Empfang wartet).
  • Sie müssen entweder sicherstellen, dass der Absender nie an sich sendet, oder nicht blockierende senden (oder nicht blockierende empfängt) verwenden, um den potenziellen Deadlock zu vermeiden.

    Verwandte Themen