我有一个应用程序,其中每个处理器都需要将数据发送到特定数量的处理器,并从未知数据大小的未知数量的处理器中回收数据,同时执行本地操作。这就是我的想法:
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_Barrier
解决问题后会使用MPI_Wait
吗?
我还有哪些其他方法可以解决这个问题?
答案 0 :(得分:1)
除非我误解了您的问题,否则您可以使用常规MPI_PROBE
。这将阻止等待消息实际到达。
但是,我不确定为什么你需要使用探测器。从您的示例代码中可以看出,使用常规MPI_RECV
和MPI_ANY_SOURCE
可以很好。 MPI_RECV
不需要命名来源。