¿Cuál es la política de transferencias asíncronas superpuestas múltiples en MPI?
Tengo un programa con varias irecvoperaciones asincrónicas abiertas . Encuentro que las transferencias que podrían tener lugar ( isendse ha llamado al correspondiente ) esperan otras transferencias que aún no están listas (el correspondiente isendaún no se ha llamado). Para ser claros, esta ineficiencia no se deriva de la contención de la red; mi red está innecesariamente inactiva.
Mi programa tiene el siguiente aspecto:
Máquina 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)
....
Máquina 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)
....
Problema
La transferencia de Cparece estar bloqueada innecesariamente por la transferencia de A.
Encuentro que el waitencendido variable Cen la Máquina 1 no se completa hasta que se completa el costoso trabajo en la Máquina 2. Esto es lamentable porque esta transferencia podría haber comenzado al comienzo de mi programa. Parece esperar innecesariamente Aa que se complete la transferencia de .
Preguntas
En particular, tengo un cálculo como el siguiente.
- ¿Se espera esto?
- ¿Cuál es la política de transferencias asincrónicas superpuestas múltiples?
- ¿Se puede evitar esto sin reorganizar mi código (hay alguna configuración interna relevante)?
- ¿Dónde debo ir para obtener más información sobre la política de MPI para múltiples transferencias en vivo?