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?