MPI_Recv没有阻止

时间:2013-05-19 21:33:47

标签: mpi

我有一个MPI_Isend和MPI_Recv程序。 假设我有2个处理器,它们都是这样的。

  1. MPI_Isend
  2. MPI_RECV
  3. MPI_WAIT
  4. 我对此的期望是在两个处理器上发送数据而不会阻塞。然后等待数据到来。然后继续,像这样。

    1. 0发送到1
    2. 1发送到0
    3. 0从1
    4. 收到
    5. 1从0
    6. 收到

      但我得到的是这个。

      1. 0发送到1
      2. 0从1收到(虽然1没发送!)
      3. 1发送到0(现在发送)
      4. 1从0
      5. 收到

        我认为MPI_Recv应该等到数据到来。可能导致这种情况的原因是什么?

2 个答案:

答案 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%概率输出实际上符合您的预期,但有很好的概率。

无论如何,原则是总是在两个输出操作之间添加一个屏障并刷新缓冲区。