如何处理MPI中接收消息数量未知的情况

6
我有一个MPI程序,每个节点都向其他节点发送一些值。发送者知道要发送数据的节点,但接收者不知道: 1)期望在其端口接收多少数据;和 2)哪些排名将向其发送。
我可以使用MPI_ANY_SOURCE解决上述问题的第二部分,但我不知道接收方如何知道它需要接收多少数据。也就是说,在接收节点应该调用MPI的接收函数多少次。

我认为使用MPI_Put可以帮助我解决问题,因为这样我就不必担心接收部分了..!! 有什么意见吗? - Neal
1个回答

1
MPI2 中单向通信的巨大优势在于您无需协调发送和接收,因此这肯定是一种方法。另一方面,在为其他人创建 MPI_Put 窗口时,仍然需要知道可能会传输多少数据,因此这可能是一个问题。
但是,协调点对点消息也是可能的。由于听起来所有发送者都知道他们将发送多少条消息以及发送给谁,因此您可以将所有这些信息组合起来。例如,假设有 4 个处理器,进程 1 必须向进程 0 和 2 中的每个进程发送一条消息。它可以有一个整数数组 toSend:
toSend[] = {1,0,1,0}
其他每个处理器也可以这样做。然后,您可以对这些数组执行 MPI_Allreduce(...., MPI_SUM,...),现在每个处理器都将知道要接收的消息总数;然后他们可以从 MPI_ANY_SOURCE 发布相同数量的非阻塞接收。
如果每个消息的数据量也不知道,那就有点棘手了;但是你可以使用数据量相同的方法来创建适当的缓冲空间;然后你可以使用 MPI_Bsend() 发送消息,接收方可以使用 MPI_Probes 和 MPI_Recv 进行接收。

对于我的问题,数据量有限,因此单向通信已经足够了。我会继续实现它。顺便说一下,第二种方法也听起来不错,如果出现任何问题,我会切换到它。感谢Jonathan的帮助.. :) - Neal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接