0

MPI_Recv 是否有可能收到标签不匹配的消息?

我的逻辑:MPI_Isend / MPI_Recv 通信。

节点 1 发送一条标记为 0 的消息,然后发送另一条标记为 1 的消息。因为节点 1 中有两个线程,所以发送动作可能同时发生。
节点 2 将探测是否有来自节点 1 的消息,如果有,则接收该消息。

在我的设计中,我希望节点 2 接收带有标签 0 的消息,然后是标签 1。但是当节点 2 探测消息来自节点 1 的信号时,它收到一条长度与标签 1 消息相同的消息. 然后没有来自节点 1 的消息。标签 0 消息似乎丢失了。

我很困惑,期待一些答案。

4

2 回答 2

2

MPI 不能丢失消息,除非它们是在“准备好的”模式下发送的,即使用MPI_Rsendor MPI_Irsend,而接收者还没有准备好,这显然不是你的情况。MPI_Isend启动发送操作,但不能保证完成,除非它进行到完成。许多 MPI 调用会导致进行非阻塞操作,但最显式的调用是MPI_Wait及其变体。还有一些 MPI 实现具有在后台进行非阻塞操作的特殊进程线程(例如,可以通过这种方式编译 Open MPI)。

如果第二个消息非常小并且正在使用不同的发送模式(例如,一些急切的发送协议),则第二个消息可能在第一个消息之前到达。MPI 仅保证具有相同信封的消息保持有序。消息信封是元组(发送者、接收者、标签、通信者)。

您还谈到从不同线程发送消息。您确定您的 MPI 库是线程安全的,并且您是否使用MPI_THREAD_MULTIPLE线程支持级别对其进行了初始化,例如:

int provided;

MPI_Init_thread(&argc, &argv, MPI_THREAD_MULTIPLE, &provided);
if (provided != MPI_THREAD_MULTIPLE)
{
   printf("Sorry, your MPI library does not provide MPI_THREAD_MULTIPLE\n");
   MPI_Abort(MPI_COMM_WORLD, 0);
}
于 2012-11-08T14:40:37.570 回答
0

您最好的选择是让接收者发布一个MPI_IRecvfor 标签 0,然后发布一个MPI_IRecvfor 标签 1。然后它等到消息进来,使用MPI_Wait*哪个可以是MPI_WaitAll,MPI_WaitAnyMPI_Wait取决于接下来需要发生的事情。

这样,您就有两个正在等待消息的接听电话,并且标记的消息会到达它们应该去的地方。

于 2012-11-08T14:23:26.353 回答