我有一个MPI_Isend和MPI_Recv程序。 假设我有2个处理器,它们都是这样的。
我对此的期望是在两个处理器上发送数据而不会阻塞。然后等待数据到来。然后继续,像这样。
但我得到的是这个。
我认为MPI_Recv应该等到数据到来。可能导致这种情况的原因是什么?
答案 0 :(得分:0)
MPI_Recv
会阻止。
您只是没有按正确的顺序看到消息,因为标准输出是缓冲的,并且您不会立即看到所有输出。
答案 1 :(得分:0)
如何使用无缓冲输出来执行输出并使用交错MPI_Barrier
进行刷新。如果您有P
个进程,则当前进程的等级存储在变量rank
中,并且您正在使用通信器comm
,您可以这样做:
for (int p = 0; p < P; ++p)
{
// Only one process writes at this time
// std::endl flushes the buffer
if (p == rank)
std::cout << "Message from process " << rank << std::endl;
// Block the other processes until the one that is writing
// flushes the buffer
MPI_Barrier(comm);
}
当然这只是一个C ++示例。您可能需要将其翻译为Fort of Fort。另请注意,此代码仍不能保证100%概率输出实际上符合您的预期,但有很好的概率。
无论如何,原则是总是在两个输出操作之间添加一个屏障并刷新缓冲区。