MPI 接收和发送功能相互阻塞?

MPI receive and send functions blocking each other?

假设我有一个 MPI process_0 等待来自两个不同进程(process_1 和 process_2)的消息。像这样:

...
MPI_Recv(&message_1, 1, MPI_INT, process_1, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
MPI_Recv(&message_2, 1, MPI_INT, process_2, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
...

想象一下 process_2 在 process_1 之前向 process_0 发送消息的场景。那会发生什么?

我想 process_0 必须收到来自 process_1 的消息才能读取来自 process_2 的消息?

process_2 的发送函数发生了什么?它是否会卡在发送函数尝试传递消息,直到 process_0 可以接收它?还是不管process_0有没有收到消息,发送函数后继续运行连续的代码?

根据 MPI 标准,正确的程序应始终假定阻塞发送(例如 MPI_Send())将阻塞,直到发布匹配的接收。

请注意,如果消息足够短(取决于您的 MPI 实现、您的互连和其他因素),它可能会以急切模式发送,MPI_Send() 将立即 return。如果您的 MPI 实现具有进度线程,则 MPI_Send() 也可能 return 在发布匹配的接收之前。话虽如此,您不应该假设这是标准强制要求的行为,如果您想编写可移植代码,您应该假设 MPI_Send() 将始终阻塞,直到发布匹配的接收。