【发布时间】: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/mpiexec 和 printf 并没有真正相互合作。有没有更有效的资源来阅读这个主题?
【问题讨论】:
-
不,这不是 stdio 流缓冲。添加
setlinebuf(stdout);并没有改变结果。但是,总是把printf后MPI_Barrier电话似乎确实有效。 -
如果你让它工作,那只是因为你只在单个处理器的内核上运行。一旦您转到多个节点,就无法同步屏幕输出。甚至不要尝试。关于这个已经有很多问题了。
标签: c printf mpi non-deterministic