2014-01-26 56 views
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来解决问题吗?

还有什么其他选择可以解决这个问题?

回答

1

除非我误解了你的问题,否则你可以使用常规的MPI_PROBE。这将阻止等待消息实际到达。

但是,我不确定你为什么需要使用探针。从你的示例代码看来,使用MPI_RECVMPI_ANY_SOURCE可以很好地工作。 MPI_RECV不需要命名来源。

+0

问题是单个消息的数量,它们的来源和所有消息大小都是未知的。这意味着我不能使用'MPI_Probe'(我想),因为我无法知道应该多少次调用它。如果我不必要地称它,那么这个过程将永远停滞!至于接收,我使用'MPI_Irec'来允许计算/通信重叠。令我困惑的是我并不完全知道'MPI_Iprobe'确定消息已经“到达” – GradGuy

相关问题