【问题标题】:Using printf with MPI leads to non-deterministic output将 printf 与 MPI 一起使用会导致不确定的输出
【发布时间】:2022-11-24 02:43:28
【问题描述】:

下面的代码在我的机器上有不确定的行为(已经只使用了两个进程)。

#include <mpi.h>
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[]) {
  int rank, size;
  MPI_Init(&argc, &argv);
  MPI_Comm_rank(MPI_COMM_WORLD, &rank);
  MPI_Comm_size(MPI_COMM_WORLD, &size);

  if (rank == size - 1) {
    printf("I am the last rank\n");
    MPI_Barrier(MPI_COMM_WORLD);
  } else {
    MPI_Barrier(MPI_COMM_WORLD);
    printf("I am rank %d\n", rank);
  }
  MPI_Finalize();
  return 0;
}

有时最后一列的输出最先出现在终端上,但有时它确实会稍后出现,即使使用了屏障。

我认为这是因为 printf 进行内部缓冲,而 MPI 分别 mpirun/mpiexecprintf 并没有真正相互合作。有没有更有效的资源来阅读这个主题?

【问题讨论】:

  • 不,这不是 stdio 流缓冲。添加setlinebuf(stdout); 并没有改变结果。但是,总是把printfMPI_Barrier 电话似乎确实有效。
  • 如果你让它工作,那只是因为你只在单个处理器的内核上运行。一旦您转到多个节点,就无法同步屏幕输出。甚至不要尝试。关于这个已经有很多问题了。

标签: c printf mpi non-deterministic


【解决方案1】:

输出重定向强烈依赖于平台,并且仅在 MPI 标准中被提及。绝对不能保证来自不同等级的输出将以什么顺序显示。甚至不能保证您可以获得该输出 - 一些实现只重定向等级 0 的输出,一些重定向没有输出,这两种情况符合 MPI 标准。

如果你想要强有序的输出,你应该只在一个等级中进行输出。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-09-19
    • 2014-01-28
    • 1970-01-01
    • 2019-12-31
    • 2019-08-04
    • 2011-06-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多