【问题标题】:MPI_Recv is not blockingMPI_Recv 没有阻塞
【发布时间】:2013-05-14 10:20:06
【问题描述】:

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

  1. MPI_Isend
  2. MPI_Recv
  3. MPI_Wait

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

  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 应该等到数据到来。这可能是什么原因造成的?

【问题讨论】:

    标签: mpi


    【解决方案1】:

    MPI_Recv 确实阻止了。

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

    【讨论】:

    • 那么有什么办法可以看到无缓冲的输出?
    • 您可以尝试在每次打印后显式刷新,但这可能无济于事,具体取决于您的设置(以太网连接?)。
    • 我不知道设置,它是一个学校的组合。但我会尝试冲洗。无论如何感谢您的回答。
    【解决方案2】:

    要获得无缓冲输出,您可以执行输出并使用交错的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++ 示例。您可能必须将其翻译成 Fortran 的 C。另请注意,此代码仍然不能保证 100% 的概率输出实际上是您所期望的,但有很好的概率。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-06
      • 2013-08-19
      • 1970-01-01
      • 2017-07-30
      相关资源
      最近更新 更多