Versión sin bloqueo de MPI_Barrier en MPI 2

8

Tengo un montón de procesos MPI que intercambian mensajes de solicitud de ida y vuelta. Los procesos no saben qué otros procesos les enviarán mensajes, o cuántos. Dada esta situación, quiero una manera eficiente de saber si todos los demás procesos se consideran terminados enviando mensajes.

Esto se lograría perfectamente con la siguiente versión sin bloqueo de MPI_Barrier, que llamaremos MPI_Ibarrier:

int MPI_Ibarrier(MPI_Comm comm, MPI_Request* request);

MPI_Ibarrier regresaría de inmediato, y las operaciones estándar en el objeto de solicitud nos avisarían cuando todos hayan alcanzado la barrera.

¿Hay alguna manera de simular este comportamiento de manera eficiente en MPI 2 (es decir, sin colectivos oficiales sin bloqueo)?

Geoffrey Irving
fuente
Y, de hecho, MPI_Ibarrier está en todo Google en referencia al grupo de trabajo MPI 3. Ahora solo necesitamos el futuro ...
Geoffrey Irving
No veo cómo funcionaría esto. Presumiblemente, está planeando llamar a MPI_Ibarrier en un proceso cuando se hace con mensajes para esta iteración y luego llamar a MPI_Wait cuando? Si las tareas van a continuar después de MPI_Ibarrier, ¿hasta dónde podrán llegar antes de que tengan que llamar a MPI_Wait? Si se les permite llegar tan lejos como antes de que tengan que saber que todos los procesos están listos, ¿por qué no simplemente poner MPI_Barrier en ese punto? IME, MPI_Barrier casi siempre está mal poner su código, excepto para fines de depuración. Casi siempre hay una forma más eficiente de estructurar el código.
Bill Barth
En este caso, creo que MPI_Ibarrier es la forma óptima, ya que cualquier mensaje de la próxima época de comunicación no puede iniciarse sin desasignar una gran cantidad de memoria y reasignar una nueva. La barrera es necesaria para saber cuándo se puede desasignar esta memoria, no directamente cuándo se pueden enviar mensajes futuros.
Geoffrey Irving

Respuestas:

11

Sorprendentemente, MPI_Ibarrieres una rutina muy útil. Por ejemplo, puede entregar una ronda de mensajes no estructurados a los rangos que no saben cuántos mensajes recibir al enviar con MPI_Issend(sí, un uso poco frecuente del envío sincrónico), luego ingresar un ciclo de alternancia MPI_Testall(para ver si los envíos se completaron) y MPI_Iprobe(para procesar mensajes entrantes). Cuando los envíos se completan, usted publica MPI_Ibarriery prueba alternativamente la barrera y prueba los mensajes entrantes. Torsten Hoefler tiene un documento sobre esto en el que demuestra la optimización de la comunicación, consulte el Algoritmo 2: http://unixer.de/publications/img/hoefler-dsde-protocols.pdf

Tenga en cuenta que una barrera no garantiza que los mensajes punto a punto u otros colectivos sin bloqueo se publiquen antes de que la barrera se haya completado. Si desea que se completen, debe asegurarse de que se hayan completado antes de publicar la barrera. Como dice Bill, (bloqueo) MPI_Barrieres incorrecto / innecesario en la mayoría de los casos. Una excepción es la comunicación a través de canales laterales, como el sistema de archivos.

Aunque no existe una forma de rendimiento similar para simular MPI_Ibarriercon MPI-2, MPICH2 proporciona MPIX_Ibarrieren la rama 1.5 (actual). Las redes de proveedores generalmente admiten estas operaciones, por lo que las implementaciones de proveedores (que generalmente se derivan de MPICH2) solo necesitan una interfaz. Tan pronto como sus parches se muevan a 1.5, MPI_Ibarriery otros colectivos sin bloqueo deberían ser compatibles. La rama de desarrollo Open MPI tiene una implementación MPI_Ibarrierbasada en libNBC.

Jed Brown
fuente
Creo que puede implementar eso con un mensaje de marca / etiqueta especial que sea más eficiente de lo que podría ser una barrera de cualquier tipo. ¿Tienes un enlace al artículo de Hoefler?
Bill Barth
@BillBarth Recuerde que esto no está estructurado y que no sabe cuántos mensajes necesita recibir. ¿Quién enviaría la etiqueta y a quién? Terminará implementando su propio Ibarrier sobre punto a punto, que será más lento que una implementación nativa. El artículo probablemente esté en su sitio web. Hablamos de eso hace unos meses.
Jed Brown
Implementar mi propia reducción de árbol sobre punto a punto es exactamente lo que terminé haciendo. Solo hay 36 llamadas de barrera en todo el programa, por lo que la desaceleración no debería ser problemática.
Geoffrey Irving