用于未知消息大小的 MPI 非阻塞发送和接收以及 mpi_iprobe()

Posted

技术标签:

【中文标题】用于未知消息大小的 MPI 非阻塞发送和接收以及 mpi_iprobe()【英文标题】:MPI non-blocking send and recv and mpi_iprobe() for unknown message size 【发布时间】:2014-03-08 12:59:46 【问题描述】:

在空间分解的 2D 域中,我需要将粒子发送到 8 个邻居。我知道我发送了多少,但不知道我会从这些邻居那里收到多少。 我已经使用 MPI_Send()、MPI_Probe() 和 MPI_Recv() 实现了一个代码,但我意识到每当消息太大时它都会导致死锁。

我决定进行非阻塞通信,但我不知道应该按什么顺序调用 MPI_Isend、MPI_Irecv 和 MPI_Iprobe?在实际调用 MPI_Irecv 之前,我绝对需要知道我的接收缓冲区应该分配的大小,所以我被 MPI_Isend() 然后 MPI_Iprobe() 然后 MPI_Irecv() 的顺序所诱惑,但问题是 MPI_Iprove() 总是返回一个标志等于 false ,我陷入了 while 循环。据我了解,MPI 没有义务在调用 MPI_Wait() 之前实际完成发送,因此我了解 MPI_Iprobe 可能永远不会返回 true。但如果是这样,在非阻塞 MPI 点对点通信中如何接收未知大小的消息?

【问题讨论】:

是的,谢谢!我已经用 MPI_Probe 和 MPI_Recv 进行了测试,效果很好。我不太确定我理解为什么 MPI_Probe 不会阻塞。消息何时发送,具体发生了什么? 抱歉重复的答案/评论。新的 SE ios 应用程序与 cmets 的答案并不完全清楚。 【参考方案1】:

您不必将所有 3 个操作都设为非阻塞。您可以将 MPI_ISEND 与常规 MPI_PROBE 和/或 MPI_RECV 一起使用。听起来这对你来说可能是一个更好的选择。

【讨论】:

为了回答您对该问题的评论,MPI_PROBE 会阻止,直到它匹配一条消息。 MOI_IPROBE 不会阻塞(因此是“I”)。

以上是关于用于未知消息大小的 MPI 非阻塞发送和接收以及 mpi_iprobe()的主要内容,如果未能解决你的问题,请参考以下文章

MPI 非阻塞发送和接收排序

MPI 非阻塞发送/接收中的请求数组

Protobuf 和非阻塞消息发送/接收

线程中阻塞 MPI_Recv 的 CPU 使用率

阻塞IO和非阻塞IO

发送多个 mpi 非阻塞发送 - 它会保留发送的顺序吗