es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

MPI no bloqueante y protocolo de encuentro.

No entiendo completamente cómo se supone que deben interactuar la comunicación no bloqueante y el protocolo de rendezvous de MPI.

En primer lugar, considera este pseudocódigo, que puede bloquearse cuando se utiliza el protocolo de rendezvous (asumamos que tenemos 2 procesos):

if (rank == 0) {
MPI_Send (big_message, destination=1)
MPI_Recv(source=1)
} else {
MPI_Send(big_message, destination=0)
MPI_Recv(source=0)
}

Esto obviamente puede bloquearse cuando el mensaje es demasiado grande para caber en el búfer interno, ya que los MPI_Send en ambos procesos esperarán a que se publique una recepción coincidente.

En mi sistema, he encontrado que la siguiente modificación funciona:

if (rank == 0) {
MPI_Isend (big_message, destination=1, &request)
MPI_Recv(source=1)
MPI_Wait(request)
} else {
MPI_Isend(big_message, destination=0, &request)
MPI_Recv(source=0)
MPI_Wait(request)
}

Usamos la comunicación no bloqueante para enviar el mensaje. ¿Sería correcta mi solución en toda implementación de MPI? He leído que las implementaciones no están obligadas a iniciar ninguna forma de comunicación cuando se llama a MPI_Isend, y pueden realizarlo al llamar a MPI_Wait. ¿Podría tal implementación romper mi código? Mi comprensión es que en tales circunstancias, MPI_Isend es simplemente una operación sin efecto y, para mi código, ambos procesos esperarían en MPI_Recv a un envío que no llega.

Si mi pseudocódigo no es portátil, ¿hay alguna manera de usar la comunicación no bloqueante para solucionarlo?

Tags:  ,

Answer

  1. Avatar for davy.ai

    Como experto en IT especializado en MPI, permítanme explicar la interacción entre la comunicación no bloqueante y el protocolo de cita de MPI.

    En el protocolo de cita, el remitente envía primero un mensaje al receptor para notificarle que un mensaje está en camino. El receptor luego publica una operación de recepción coincidente para recibir el mensaje. Esto puede provocar un bloqueo si el búfer no es lo suficientemente grande para contener el mensaje.

    Para evitar el bloqueo, podemos usar la comunicación no bloqueante con MPI_Isend en lugar de MPI_Send. De esta manera, la operación de envío devuelve de inmediato y el programa no espera a que se publique una recepción coincidente.

    Sin embargo, es importante destacar que las implementaciones de MPI no están obligadas a iniciar ningún tipo de comunicación cuando se llama a MPI_Isend. La comunicación puede realizarse al llamar a MPI_Wait o cualquier otra función de MPI que requiera comunicación.

    Para garantizar la portabilidad del código que utiliza la comunicación no bloqueante, podemos usar MPI_Test o MPI_Wait para verificar el estado de la solicitud de comunicación y esperar hasta que se complete antes de continuar con la operación de recepción.

    Por lo tanto, el pseudocódigo modificado proporcionado por el experto en IT es correcto y debería funcionar en la mayoría de las implementaciones de MPI. Sin embargo, se recomienda verificar la documentación específica de implementación y asegurarse de usar correctamente las funciones de comunicación no bloqueante para evitar posibles bloqueos.

Comments are closed.