Was ist die Richtlinie für mehrere überlappende asynchrone Übertragungen in MPI?
Ich habe ein Programm mit mehreren offenen asynchronen irecv
Operationen. Ich finde, dass Übertragungen, die stattfinden könnten (der entsprechende isend
wurde aufgerufen), auf andere Übertragungen warten, die noch nicht bereit sind (der entsprechende isend
wurde noch nicht aufgerufen). Um klar zu sein, diese Ineffizienz beruht nicht auf Netzwerkkonflikten. Mein Netzwerk ist unnötig inaktiv.
Mein Programm sieht folgendermaßen aus:
Maschine 1
call irecv(variable A from machine 2)
call irecv(variable B from machine 2)
call irecv(variable C from machine 2)
call wait(variable C from machine 2)
call do_important_work_with(variable C)
....
Maschine 2
call isend(variable C to machine 1)
call isend(variable B to machine 1)
call do a bunch of costly work
call isend(variable A to machine 1)
....
Problem
Die Übertragung von C
scheint durch die Übertragung von unnötig blockiert zu werden A
.
Ich stelle fest, dass das wait
Einschalten variable C
auf Maschine 1 erst abgeschlossen ist, nachdem die kostspielige Arbeit auf Maschine 2 abgeschlossen ist. Dies ist bedauerlich, da diese Übertragung zu Beginn meines Programms hätte beginnen können. Es scheint unnötig zu warten, bis die Übertragung A
abgeschlossen ist.
Fragen
Insbesondere habe ich eine Berechnung wie die folgende.
- Wird das erwartet?
- Was ist die Richtlinie für mehrere überlappende asynchrone Übertragungen?
- Kann dies vermieden werden, ohne meinen Code neu zu ordnen (gibt es relevante interne Einstellungen)?
- Wohin soll ich gehen, um mehr über die Richtlinien von MPI für mehrere Live-Übertragungen zu erfahren?
quelle
Antworten:
Der Standard gibt keine Garantie dafür, dass bei den nicht blockierenden Sendungen Fortschritte erzielt werden, bis Sie tatsächlich anrufen
MPI_WAIT
. Es ist eine absolut gültige Implementierung, um nur die Vorgänge in die Warteschlange zu stellen, und wenn Sie aufrufenMPI_WAIT
, werden alleMPI_ISEND
Vorgänge auf einmal abgeschlossen. In der Realität haben sie normalerweise die Möglichkeit, bei jedem Aufrufen der MPI-Bibliothek Fortschritte zu erzielen. Wenn Sie asynchrone Fortschritts-Threads aktivieren, haben sie eine bessere Chance, im Hintergrund Fortschritte zu erzielen.In Bezug auf das Signaturproblem garantiert MPI, dass Nachrichten auf demselben Kommunikator in denselben Rängen in derselben Reihenfolge empfangen werden, in der sie gesendet wurden.
Aus dem MPI Standard Version 3.0:
Dies sagt nichts darüber aus, wie die Implementierung die Nachrichten sendet, aber zumindest werden sie in der richtigen Reihenfolge empfangen.
Mein Rat wäre, zuerst sicherzustellen, dass Sie Fortschritts-Threads aktiviert haben, und dann sicherzustellen, dass Sie warten, wo Sie die gesendeten Nachrichten wirklich benötigen (obwohl Sie mit Fortschritts-Threads höchstwahrscheinlich in Ordnung sind).
quelle