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)?
Respuestas:
Sorprendentemente,
MPI_Ibarrier
es 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 conMPI_Issend
(sí, un uso poco frecuente del envío sincrónico), luego ingresar un ciclo de alternanciaMPI_Testall
(para ver si los envíos se completaron) yMPI_Iprobe
(para procesar mensajes entrantes). Cuando los envíos se completan, usted publicaMPI_Ibarrier
y 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.pdfTenga 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_Barrier
es 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_Ibarrier
con MPI-2, MPICH2 proporcionaMPIX_Ibarrier
en 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_Ibarrier
y otros colectivos sin bloqueo deberían ser compatibles. La rama de desarrollo Open MPI tiene una implementaciónMPI_Ibarrier
basada en libNBC.fuente
Consulte http://www.unixer.de/research/nbcoll/ , especialmente http://www.unixer.de/research/nbcoll/libnbc/ , que es la implementación de referencia que se encuentra en la parte superior de MPI-1. Como dijo Jed, MPICH2 1.5 ya tiene NBC y la implementación es similar a la de Torsten (aunque casi seguramente más rápida debido a una sobrecarga más baja).
fuente