¿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?
fuente
Respuestas:
No hay garantía en el estándar de que se realice ningún progreso en los envíos sin bloqueo hasta que realmente llame
MPI_WAIT
. Es una implementación perfectamente válida para poner en cola las operaciones y cuando llamaMPI_WAIT
, todas lasMPI_ISEND
operaciones se completan a la vez. En realidad, suelen tener la oportunidad de progresar cada vez que ingresa a la biblioteca MPI y si habilita hilos de progreso asíncrono, tienen una mejor oportunidad de progresar en segundo plano.En cuanto al problema de la firma, MPI garantiza que los mensajes en el mismo comunicador a los mismos rangos se recibirán en el mismo orden en que fueron enviados.
Desde el MPI Standard versión 3.0:
Esto no dice nada acerca de cómo la implementación elige enviar los mensajes, pero al menos se recibirán en el orden correcto.
Mi consejo sería primero asegurarse de que tiene subprocesos de progreso habilitados, luego asegurarse de que está llamando esperar donde realmente necesita los mensajes enviados (aunque con subprocesos de progreso, lo más probable es que esté bien).
fuente