2

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

  1. MPI_Isend
  2. MPI_Recv
  3. MPI_等待

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

  1. 0 发送到 1
  2. 1 发送到 0
  3. 0 从 1 接收
  4. 1 从 0 接收

但我得到的是这个。

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

我认为 MPI_Recv 应该等到数据到来。这可能是什么原因造成的?

4

2 回答 2

1

MPI_Recv确实阻塞。

您只是看不到正确顺序的消息,因为标准输出是缓冲的,您不会一次看到所有输出。

于 2013-05-19T21:36:50.293 回答
0

要获得一种无缓冲的输出,您可以做的是执行输出并使用 interleaved 刷新MPI_Barrier。如果您有P进程,则当前进程的排名存储在变量中rank并且您正在使用 communicator 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++ 示例。您可能必须将其翻译成 Fortran 的 C。另请注意,此代码仍然不能保证 100% 的概率输出实际上是您所期望的,但有很好的概率。

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

于 2013-05-20T02:10:32.357 回答