Política MPI para transferencias asíncronas múltiples

8

¿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?
MRocklin
fuente
¿Qué tan grandes son las transferencias? Las transferencias con la misma firma deben realizarse en orden. ¿Utiliza diferentes etiquetas para las diferentes transferencias? Además, no debería importar qué pila de MPI utilice. La semántica del pedido de transferencias está definida por los estándares MPI.
Bill Barth
Las transferencias son grandes (alrededor de 1 MB) y tienen el mismo tamaño / origen / destino (¿es esta la firma?). Tienen diferentes etiquetas.
MRocklin
Las diferentes etiquetas deberían permitirles ir en cualquier orden, pero el hardware realmente tiene que mover los datos, y realmente no puede hacerlo en paralelo. Por lo tanto, si se trata de un mensaje grande, es posible que esté esperando que el hardware subyacente copie A y B en memorias intermedias internas o que lo envíe DMA a la NIC (dependiendo del hardware que tenga). Recomendaría alterar el orden en el que publica los recibos y también intente usar una pila diferente (MPICH, MVAPICH, Intel MPI, etc.) dependiendo de su hardware. Además, puede intentar activar los hilos de progreso.
Bill Barth
Si tiene este tipo de patrón de comunicación, ya a través de Ethernet, le recomiendo utilizar zmq en lugar de mpi.
meawoppl

Respuestas:

6

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 llama MPI_WAIT, todas las MPI_ISENDoperaciones 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:

Los mensajes de pedido no se adelantan: si un remitente envía dos mensajes seguidos al mismo destino y ambos coinciden con la misma recepción, esta operación no puede recibir el segundo mensaje si el primero aún está pendiente. Si un receptor publica dos recibos seguidos, y ambos coinciden con el mismo mensaje, entonces la segunda operación de recepción no puede ser satisfecha por este mensaje, si el primero aún está pendiente.

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).

Wesley Bland
fuente