В 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
Для всех файлов операторы «после барьера» всегда будут появляться позже.
person
Shawn Chin
schedule
03.03.2011