tutorial programming open mpirun mpi_recv mpi_allgather for espaƱol ipc mpi openmpi

ipc - mpirun - open mpi programming



diferencia entre MPI_Send() y MPI_Ssend()? (1)

Sé que MPI_Send() es una llamada de bloqueo, que espera hasta que sea seguro modificar el búfer de la aplicación para su reutilización. Para hacer que la llamada de envío sea sincrónica (debe haber un apretón de manos con el receptor), necesitamos usar MPI_Ssend() . Quiero saber la diferencia entre los dos. Supongamos que necesito enviar una cantidad fija de Bytes entre los procesos, ¿cuál se supone que debe llevar más tiempo?
Conmigo el código funciona bien la llamada MPI_Send () pero espera indefinidamente a MPI_Ssend (). ¿Cuáles podrían ser las posibles razones?

Y lo más importante es que estoy bastante seguro de que los datos se reciben en el proceso de recepción cuando se usa MPI_Send() , por lo que esta inferencia no lleva a ningún lado a esperar el saludo cuando se usa MPI_Ssend() .

O puedo llegar a una conclusión: con MPI_Send() , puede enviar datos al proceso propio pero no puede usar MPI_Ssend() .


Hay una pequeña pero importante diferencia entre los dos (puede encontrarla en el documento estándar de MPI en la Sección 3.4). Con un MPI_SEND normal, la implementación volverá a la aplicación cuando el búfer esté disponible para su reutilización. Esto podría ser antes de que el proceso de recepción haya publicado la recepción. Por ejemplo, podría ser cuando un pequeño mensaje se ha copiado en un búfer interno y el búfer de la aplicación ya no es necesario. Sin embargo, para mensajes grandes que pueden no estar almacenados internamente en el búfer, la llamada puede no retornar hasta que se haya enviado la cantidad suficiente del mensaje al proceso remoto para que el búfer ya no sea necesario.

La diferencia entre esto y MPI_SSEND es que este último siempre esperará hasta que la recepción se haya publicado en el extremo receptor. Incluso si el mensaje es pequeño y se puede almacenar en el búfer internamente, seguirá esperando hasta que el mensaje haya comenzado a recibirse en el otro lado.

MPI_SSEND es una forma de asegurar que ambos procesos hayan alcanzado un cierto punto en su ejecución sin tener que hacer un MPI_BARRIER , por ejemplo. Si su aplicación está enviando y recibiendo desde y hacia el mismo rango, no es seguro hacer MPI_SEND o MPI_SSEND , ya que cualquiera de ellos podría bloquearse indefinidamente. En su lugar, debe usar MPI_ISEND y MPI_IRECV para que las llamadas vuelvan inmediatamente y el envío / recepción real se pueda hacer al mismo tiempo (en la llamada a MPI_WAITALL .