В MPI_Barrier () нет ничего плохого.
Поскольку Дженс упомянул , причина, по которой вы не видите ожидаемого результата, заключается в том, что stdout буферизуется в каждом процессе.Нет гарантии, что отпечатки из нескольких процессов будут отображаться в вызывающем процессе по порядку.(Если стандартный вывод из каждого процесса будет передан в основной процесс для печати в режиме реального времени, это приведет к большому количеству ненужного общения!)
Если вы хотите убедиться, что барьер работает, вы можете попробовать написатьв файл вместо.Наличие нескольких процессов, записывающих в один файл, может привести к дополнительным сложностям, поэтому каждый процесс может записывать в один файл, а затем после барьера поменять местами файлы, в которые они записывают.Например:
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
Для всех файлов«после барьера» заявления всегда будут появляться позже.