30

いつバリアを使用する必要があるのだろうか?たとえば、スキャッター/ギャザーの前後に必要ですか? それとも、分散/収集する前に、OMPI はすべてのプロセスがそのポイントに到達したことを確認する必要がありますか? 同様に、ブロードキャストの後、すべてのプロセスがすでにメッセージを受信して​​いると期待できますか?

4

3 に答える 3

20

の用途の1つMPI_Barrierは、たとえば、MPIを使用してアクセスされないファイルシステムなどの外部リソースへのアクセスを制御することです。たとえば、各プロセスでファイルに順番に書き込みを行う場合は、次のように実行できます。

int rank, size;
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &size);
for ( int ii = 0; ii < size; ++ii ) {
    if ( rank == ii ) {
        // my turn to write to the file
        writeStuffToTheFile();
    }
    MPI_Barrier(MPI_COMM_WORLD);
}

そうすれば、2つのプロセスが同時に呼び出していないことを確認できますwriteStuffToTheFile

于 2012-11-09T13:13:27.890 に答える
0

MPI_Barrier() はあまり使用されませんが、便利です。実際、同期通信を使用していたとしても、MPI_Send/Recv() は 2 つのプロセスが同期していることを確認することしかできません。私のプロジェクト、cuda+MPI プロジェクトでは、非同期通信だけを使用しました。場合によっては、MPI_Barrier() の後に Wait() 関数を使用しないと、2 つのプロセス (gpu) が同時に相互にデータを送信したいという状況が発生する可能性が非常に高いことがわかりました。プログラムの効率を低下させます。上記のバグは私を怒らせ、見つけるのに数日かかります。したがって、プログラムで MPI_Isend/Irecv を使用したときに MPI_Barrier() を使用するかどうかを慎重に検討してください。プロセスの同期が必要なだけでなく、必要な場合もあります。特に、プログラムがデバイスを処理している場合はそうです。

于 2015-09-29T11:17:21.787 に答える