¿Cuál es la política de transferencias asíncronas superpuestas múltiples en MPI?
Tengo un programa con varias irecv
operaciones asincrónicas abiertas . Encuentro que las transferencias que podrían tener lugar ( isend
se ha llamado al correspondiente ) esperan otras transferencias que aún no están listas (el correspondiente isend
aú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 C
parece estar bloqueada innecesariamente por la transferencia de A
.
Encuentro que el wait
encendido variable C
en 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 A
a 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?