如何处理mpi中的情况,其中要接收的消息数是未知的

Nea*_*eal 6 mpi

我有一个MPI程序,每个节点都会向其他节点发送一些值.发件人知道哪些节点发送数据但接收者不知道1)在他们的结束时预期有多少数据,2)哪些等级将发送给它.

我可以使用MPI_ANY_SOURCE来解决上述问题的第二部分,但我不知道接收器如何知道它必须接收多少.即我应该在接收节点的MPI中调用接收函数多少次.

Jon*_*rsi 1

MPI2 中单方面通信的最大优点是您不需要协调发送与接收,因此这肯定是一种方法。另一方面,您仍然需要知道在为其他人创建 MPI_Put 窗口时可能会收到多少数据。所以这可能是一个问题。

但协调点对点消息也是可能的。由于听起来所有发件人都知道他们将发送多少条消息以及发送给谁,因此您可以合并所有这些信息。例如,假设有 4 个处理器,进程 1 必须向进程 0 和 2 各发送一条消息。它可以有一个整数数组 toSend:

toSend[] = {1,0,1,0}

其他每个处理器也可以。然后你可以做一个MPI_Allreduce(...., MPI_SUM,...)这样的数组,现在每个处理器都会知道要接收的消息总数;然后他们可以发布来自 的许多非阻塞接收MPI_ANY_SOURCE

如果每条消息的数据量也不知道,那就有点棘手了;但你可以对数据量做同样的事情;创建适当的缓冲空间;然后您可以执行MPI_Bsend()s 操作,接收器可以执行 MPI_Probes 和 MPI_Recv 操作。