0
我有一个应用程序,其中每个处理器需要发送数据到特定数量的处理器,并从未知数量的未知数据大小的处理器接收数据,而这些处理器都是在执行本地操作的同时。这是我的想法:MPI_Iprobe何时会返回true?
MPI_Isend(...)
// Do local computation
MPI_Wait(...)
int flag;
MPI_Status st;
MPI_Iprobe(MPI_ANY_SOURCES, tag, &flag, comm, &st);
While(flag) {
MPI_Irecv(st.MPI_SOURCE,...);
MPI_Iprobe(MPI_ANY_SOURCES, tag, &flag, comm, &st);
}
我保证说MPI_Iprobe
在这种情况下,将能够找到发送的消息的每一个?我怀疑如果当前的等级有更少的工作要做,它会在其他处理器有足够的时间来实际发送消息之前达到MPI_Iprobe
,在这种情况下,我会错过一些消息。那样的话,MPI_Wait
之后会用MPI_Barrier
来解决问题吗?
还有什么其他选择可以解决这个问题?
问题是单个消息的数量,它们的来源和所有消息大小都是未知的。这意味着我不能使用'MPI_Probe'(我想),因为我无法知道应该多少次调用它。如果我不必要地称它,那么这个过程将永远停滞!至于接收,我使用'MPI_Irec'来允许计算/通信重叠。令我困惑的是我并不完全知道'MPI_Iprobe'确定消息已经“到达” – GradGuy