MPI_Barrier() 没有任何问题。
正如Jens 所提到的,您看不到预期输出的原因是因为 stdout 在每个进程上都有缓冲。不能保证来自多个进程的打印将按顺序显示在调用进程上。(如果每个进程的stdout实时传输到主进程打印,会导致很多不必要的通信!)
如果您想说服自己屏障有效,您可以尝试写入文件。让多个进程写入单个文件可能会导致额外的复杂性,因此您可以让每个 proc 写入一个文件,然后在屏障之后交换它们写入的文件。例如:
Proc-0 Proc-1
| |
f0.write(..) f1.write(...)
| |
x ~~ barrier ~~ x
| |
f1.write(..) f0.write(...)
| |
END END
示例实现:
#include "mpi.h"
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv) {
char filename[20];
int rank, size;
FILE *fp;
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &size);
if (rank < 2) { /* proc 0 and 1 only */
sprintf(filename, "file_%d.out", rank);
fp = fopen(filename, "w");
fprintf(fp, "P%d: before Barrier\n", rank);
fclose(fp);
}
MPI_Barrier(MPI_COMM_WORLD);
if (rank < 2) { /* proc 0 and 1 only */
sprintf(filename, "file_%d.out", (rank==0)?1:0 );
fp = fopen(filename, "a");
fprintf(fp, "P%d: after Barrier\n", rank);
fclose(fp);
}
MPI_Finalize();
return 0;
}
运行代码后,您应该得到以下结果:
[me@home]$ cat file_0.out
P0: before Barrier
P1: after Barrier
[me@home]$ cat file_1.out
P1: before Barrier
P0: after Barrier
对于所有文件,“after Barrier”语句总是会在后面出现。