MPI_Barrier()沒有錯。
由於Jens mentioned,你沒有看到你所期望的輸出的原因是因爲標準輸出緩衝在每個進程。不能保證來自多個進程的打印將依次顯示在調用進程中。 (如果將每個進程的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;
}
運行代碼後,你應該得到以下結果:
[[email protected]]$ cat file_0.out
P0: before Barrier
P1: after Barrier
[[email protected]]$ cat file_1.out
P1: before Barrier
P0: after Barrier
的所有文件,在 「後障」 中的語句總是晚點出現。
如果MPI進程在不同的節點上運行,則依賴時間戳可能並不理想,除非您可以保證時鐘已同步。 – 2011-03-03 17:05:00
@Shawn:有MPI_Wtime()。 – suszterpatt 2011-03-03 18:15:51
@suszterpatt:'MPI_Wtime()'通常不是全局/同步時鐘! (只有在'MPI_WTIME_IS_GLOBAL'被定義併爲true時) – Zulan 2011-03-03 18:30:59