Según tengo entendido, el orden en que se reciben los mensajes MPI punto a punto sin bloqueo (Isend e Irecv) es coherente con el orden en que se envían. ¿Hay alguna técnica para dar prioridad a ciertos mensajes sobre otros?
Por ejemplo, tenemos un algoritmo multinivel en el que las soluciones de alta resolución se envían con llamadas sin bloqueo y se realizan cálculos en los niveles gruesos mientras se envían los mensajes finos. Sin embargo, cuando llega el momento de enviar las soluciones de baja resolución, nos gustaría que tengan prioridad (esencialmente están bloqueando).
También puedo imaginar que esto podría ser útil para otros algoritmos a medida que avanzamos hacia el exascale: algunos mensajes están en la "ruta crítica" mientras que otros no.
Actualmente MPI no tiene disposiciones para la priorización de mensajes y tampoco tiene el próximo estándar MPI 3.0. Depende de la implementación de MPI decidir cómo transmitir los mensajes. Por ejemplo, los mensajes más pequeños pueden enviarse más rápido debido a ciertas omisiones en la maquinaria de comunicación (altamente dependiente de la implementación y del sistema). Es posible que pueda aprovechar el hecho de que la mayoría de las implementaciones de MPI dividen los mensajes grandes en fragmentos y los mensajes más pequeños pueden deslizarse entre los fragmentos grandes. Pero, una vez más, esto depende mucho de la implementación y no confiaría en eso.
Hice un experimento simple usando Open MPI 1.5.3 a través de la conexión InfiniBand. El programa envía un mensaje muy grande (1 GiB) con
MPI_Isend
y luego dos mensajes cortos (16 bytes) conMPI_Send
, y luego espera a que se complete el envío grandeMPI_Wait
. Por otro lado,MPI_Irecv
primero se publica un para la gran recepción y luego dosMPI_Recv
operaciones posteriores , seguidas porMPI_Wait
la gran recepción. Siempre pude recibir los dos mensajes cortos antes de que se completara la recepción del mensaje grande. Aquí está el resultado de mi prueba:Ambos envíos pequeños tienen éxito antes de que el envío asíncrono se haya completado como lo demuestra el tiempo de espera de ~ 700 ms. Diría que la primera recepción pequeña tiene éxito algún tiempo (~ 300 ms) después de que la recepción grande haya comenzado en segundo plano. Intenté esto usando solo
MPI_COMM_WORLD
o usando un comunicador separado para los mensajes pequeños: los resultados son los mismos. Los nodos tienen un QDR IB HCA cada uno y su ejecución--mca btl_base_verbose 50
confirma que no hay canales de comunicación alternativos en uso.fuente
Esto no es compatible con MPI ni con ningún otro middleware de comunicación que conozca. Esto probablemente se deba a que no es compatible con ningún hardware que conozca, con la excepción de Blue Gene, donde hay paquetes de alta prioridad para mensajes de control que superarán a otros mensajes en algunas condiciones. Sin embargo, estos no son de uso general ya que solo permiten que uno comunique 64 bytes (al menos en Blue Gene / P).
La buena noticia es que no necesitas esto. La sobrecarga para implementarlo no valdrá la pena y encontrará, suponiendo que alguna vez investigue los detalles de bajo nivel, que no implementar las prioridades en la red le permite a MPI ofrecer el mejor rendimiento en la mayoría de los usos.
fuente
Es un poco extraño que mencione esto en el contexto del orden de los mensajes. Citandote:
Vale la pena señalar aquí que MPI solo garantiza que los mensajes coincidentes entre procesos se recibirán en el orden en que fueron enviados. Realmente no desea que cambie este tipo de orden, porque hace que su código sea más comprensible y le quita una gran carga como programador de aplicaciones.
Sin embargo, si envió mensajes con diferentes etiquetas, eso cambia los criterios de coincidencia, y podría recibir fácilmente el segundo antes que el primero. Vea el segundo ejemplo en la parte relevante de la norma para más detalles. Yo espero que si usted tiene dos piezas de código que envían al mismo tiempo que ya está separando los mensajes grueso y fino usando las etiquetas, y no tratar de poner en práctica algún protocolo de su propio mensaje en la parte superior del ordenamiento. Esta es una segunda naturaleza para la mayoría de los programadores de MPI que conozco.
De todos modos, suponiendo que lo esté haciendo, probablemente le preocupe que los mensajes de gran volumen y granularidad obstruyan su red cuando desee enviar los gruesos. Mi consejo general al respecto es que si no se trata de un problema de rendimiento que realmente se puede medir en este momento, entonces realmente no debería molestarse en abordarlo. Parece confirmar que todavía no es un problema en uno de los comentarios anteriores.
Una posible solución que podría considerar sería utilizar un colectivo sin bloqueo (NBC) como Bcast o Barrier para notificar a todos que la fase gruesa está lista y lista para enviar su solución. Con toda probabilidad, el tráfico de NBC no se priorizará, pero los procesos notificados pueden al menos dejar de enviar gotas de soluciones finas hasta que se realicen los envíos generales. Los NBC estarán en MPI-3 o podría intentar usar libNBC si no puede esperar tanto.
Una vez más, sin embargo, esto parece mucho trabajo para algo que todavía no parece ser un problema de rendimiento.
fuente