首页 > 解决方案 > MPI 接收和发送功能相互阻塞?

问题描述

假设我有一个 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 是否收到它并在发送函数之后继续运行连续代码?

标签: parallel-processingmpi

解决方案


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

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


推荐阅读