2012-07-08 15 views
10

¿Qué sucede si usa uno de los métodos de comunicación de MPI para que un rango se comunique consigo mismo? ¿Existe un comportamiento bien definido (por ejemplo, garantizado para tener éxito o no), o depende de la casualidad/otras influencias incontrolables, ya sea que el programa continúe ejecutándose o no?¿Está bien definido el comportamiento de la comunicación MPI de rango?

Un ejemplo sería un código de dinámica de fluidos, donde cada rango determina qué celdas de cuadrícula deben enviarse a los rangos vecinos para crear el halo necesario para la plantilla computacional. Si la simulación se inicia solo en un rango, se enviaría/recibiría sin bloqueo del rango 0 consigo mismo (enviando información de 0-length).

Respuesta

12

Si bien puede evitar la auto-mensajería según la respuesta de suszterpatt, la auto-mensajería funcionará y es parte del estándar MPI. Incluso hay un comunicador de conveniencia predefinido MPI_COMM_SELF. Siempre que las llamadas de envío/recepción no provoquen un interbloqueo (por ejemplo, se usan llamadas no bloqueadas), el envío a sí mismo está bien. Por supuesto, los almacenamientos intermedios de envío y recepción no deben superponerse.

Tenga en cuenta que con OpenMPI necesita enable the self BTL.


Fuente: MPI 1.1 Section 3.2.4

Fuente = se permite destino, es decir, un proceso puede enviar un mensaje a sí mismo. (Sin embargo, no es seguro hacerlo con las operaciones de bloqueo de envío y recepción descritas anteriormente, ya que esto puede conducir a un punto muerto. Consulte la Sección 3.5. Semántica de la comunicación punto a punto)

+0

Esas son buenas noticias. ¿Podría apuntar al capítulo en el estándar MPI actual que formula la política de envío a sí mismo? Lo he estado buscando por mí mismo y no pude encontrar nada. –

+0

Agregué la fuente a la respuesta. –

1

En un envío de modo estándar (es decir, MPI_Send()), depende de la implementación de MPI determinar si se almacenará el mensaje o no. Es razonable suponer que cualquier implementación, o al menos las populares, reconocerá un envío a sí mismo, y decidirá almacenar el mensaje. La ejecución continuará y una vez que se realice la llamada de recepción coincidente, el mensaje se leerá desde el búfer. Si quiere estar absolutamente seguro, puede usar MPI_Bsend(), pero entonces puede ser su responsabilidad administrar el buffer a través del MPI_Buffer_attach() y MPI_Buffer_detach().

Sin embargo, la solución ideal para su problema específico es usar MPI_PROC_NULL en el argumento fuente/destino de las llamadas de envío/recepción, lo que hará que Send y Recv renuncien a cualquier comunicación y devuelvan lo antes posible.

Cuestiones relacionadas