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

时间:2011-04-30 19:23:28

标签: mpi

我有一个MPI程序,每个节点都会向其他节点发送一些值。发件人知道哪些节点发送数据但接收者不知道 1)预计会有多少数据 2)哪些级别将发送给它。

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

1 个答案:

答案 0 :(得分:1)

MPI2中单边通信内容的巨大优势在于您不需要使用接收来协调发送,因此肯定会采用一种方法。另一方面,您仍然需要知道在为其他人创建MPI_Put的窗口时可能会有多少数据。所以这可能是一个问题。

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

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

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

如果每条消息的数据量都不知道,那就有点棘手了;但你可以用大量的数据做同样的事情;创造适当的缓冲空间;你可以做MPI_Bsend() s,接收者可以做MPI_Probes和MPI_Recv。