MPI_Barrier()に問題はありません。
Jensが述べたように、期待した出力が表示されない理由は、stdoutが各プロセスでバッファリングされているためです。複数のプロセスからの印刷が呼び出し元のプロセスに順番に表示されるという保証はありません。(各プロセスからの標準出力がリアルタイムで印刷するためにメインプロセスに転送されると、多くの不要な通信につながります!)
バリアが機能していることを確信したい場合は、代わりにファイルに書き込んでみてください。複数のプロセスが単一のファイルに書き込むと、さらに複雑になる可能性があるため、各procが1つのファイルに書き込み、バリアの後で、それらが書き込むファイルを交換することができます。例えば:
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
すべてのファイルについて、「afterBarrier」ステートメントは常に後で表示されます。