MPI_Barrierが正しく動作しない

mpi.hでは、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<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つのプロセッサで実行) したがって、障壁があっても、すべてのプロセッサが同時に値を印刷し始めます。 どうして?

0

1 答え

printf to stdout is buffered, and by default flushes the buffer at each \n. So each processor in turn prints its rank and flushes the buffer with \n, then prints 0 and flushes the buffer. Each processor then uses printf to load "1 2 3 4" into the output buffer, but doesn't flush. The flush happens the the end of the program, so all the final lines appear at once.

IOを順番に確認するには、障壁の前に fflush(stdout)を追加してください。 I/O順序付けを完全に制御するには、MPIがI/O順序保証を提供しないため、1つのプロセッサーをI/O実行専用にします。

3
追加された