2011-10-27 83 views
0

在mpi.h中,我試圖使用MPI_Barrier,但它不能正常工作。 下面是一個例子:MPI_Barrier無法正常工作

int main(int argc, char **argv) 
{ 
    MPI_Init(&argc,&argv); 
    int i,j,rank,np; 
    MPI_Comm_size(MPI_COMM_WORLD,&np); 
    MPI_Comm_rank(MPI_COMM_WORLD,&rank); 
    for(i=0;i<np;i++) 
    { 
     if(rank==i) 
     { 
      printf("\n(%d)\n",rank); 
      for(j=0;j<5;j++) 
      { 
       printf("%d\t",j); 
       if((j%10)==0) 
        printf("\n"); 
      } 
     } 
     MPI_Barrier(MPI_COMM_WORLD); 
    } 
    MPI_Finalize(); 
    return 0; 
} 

的輸出是:

(0) 
0 

(1) 
0 

(2) 
0 

(3) 
0 
1  2  3  4  1  2  3  4  1  2  3  4 
1  2  3  4 

(帶有4個處理器執行) 因此,所有的處理器同時開始打印值,即使是有障礙。 爲什麼?

回答

3

printfstdout被緩衝,並默認在每個\n處刷新緩衝區。因此,每個處理器依次打印其級別並用\n刷新緩衝區,然後打印0並刷新緩衝區。每個處理器然後使用printf將「1 2 3 4」加載到輸出緩衝區,但不會刷新。沖洗發生在程序結束時,因此所有最終行都立即出現。

要按順序查看您的IO,請在屏障前添加fflush(stdout)。爲了完全控制I/O排序,請專門爲一個處理器執行I/O,因爲MPI不提供任何I/O順序保證。