Was ist die Richtlinie für mehrere überlappende asynchrone Übertragungen in MPI?
Ich habe ein Programm mit mehreren offenen asynchronen irecvOperationen. Ich finde, dass Übertragungen, die stattfinden könnten (der entsprechende isendwurde aufgerufen), auf andere Übertragungen warten, die noch nicht bereit sind (der entsprechende isendwurde 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 Cscheint durch die Übertragung von unnötig blockiert zu werden A.
Ich stelle fest, dass das waitEinschalten variable Cauf 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 Aabgeschlossen 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?