2011-12-21 3 views
1

私は練習のためにここで行っているコードを見ています。オープンMPIの削減は同期化されていますか?

http://www.mcs.anl.gov/research/projects/mpi/usingmpi/examples/simplempi/main.html

私はここで示した部分について混乱しています。

MPI::COMM_WORLD.Reduce(&mypi, &pi, 1, MPI::DOUBLE, MPI::SUM, 0); 
if (rank == 0) 
    cout << "pi is approximately " << pi 
     << ", Error is " << fabs(pi - PI25DT) 
     << endl; 

私の質問MPIは他のすべてのプロセスは、(この場合には、ランク1-3とプログラム)が終了したら、知っているし、その結果が完了したことの機能を削減するんでしょうか?

答えて

6

すべての共同通信呼び出し(Reduce、Gather、Scatterなど)はブロックされています。

+0

すべての通信は完了するまでブロックされますか? –

+0

すべての[_collective_ communication calls](http://www.netlib.org/utk/papers/mpi-book/node91.html#SECTION00500000000000000000)doは、指定されたグループ内の他のすべてのプロセスが一致する呼び出しに達しました。 – suszterpatt

+0

@suszterpatt、それは本当です。 – jman

3

@ g.inozemtsevが正しい。 Open MPIのものを含むMPI集合呼び出しは、MPIの意味で「ブロック」しています。つまり、呼び出しが返ったときにバッファを使用できます。 MPI_REDUCEのような操作では、ルートプロセスは、返ってくるときにそのバッファに答えを持つことを意味します。さらに、MPI_REDUCEの非ルートプロセスは、MPI_REDUCEが返ってきたときに安全にそのバッファを上書きできることを意味します(通常は、削減の部分が完全であることを意味します)。

ただし、前述のように、MPI_REDUCEなどの一括処理からの復帰は、ピアプロセスでの同じ一括処理の復帰には関係しません。バリアは明示的な同期として定義されているのに対して、他のすべてのMPI-2.2集合操作は明示的に同期する必要はないため、この規則の唯一の例外はMPI_BARRIERです。

具体的な例として、すべての非ルートプロセスが時刻XでMPI_REDUCEを呼び出すとします。ルートは最終的に時刻X + NでMPI_REDUCEを呼び出します(この例ではNが大きいとします)。実装によっては、ルート以外のプロセスがX + Nよりもずっと前に戻るか、X + N(+ M)までブロックされる可能性があります。この時点では、MPI実装が意図している/必要としていること(リソース消費/可用性によって決まるかもしれない)を行うことができるように、MPI標準は意図的に曖昧です。

したがって、@ g.inozemtsevの「あなたは同期に頼ることはできません」(MPI_BARRIERを除く)という点は正しいです。

関連する問題