MPI standardは、セクションに関するMPIとスレッドを持っています。 1つの重要な部分は、次のとおりです。
初期化と終了MPI_FINALIZE
への呼び出しは、MPIを初期化した同じスレッド上で発生する必要があります。このスレッドをメインスレッドと呼びます。 すべてのプロセススレッドがMPI呼び出しを完了し、保留中の通信またはI/O操作を実行していない場合にのみ、呼び出しが行われます。
あなたのコードはこの要件を満たしています。
MPIは、いくつかのレベルのスレッドサポートを認識しています。
MPI_THREAD_FUNNELED
プロセスがマルチスレッドのかもしれませんが、アプリケーションは、メインスレッドがMPI呼び出しを作ることを確認する必要があります:あなたのコードが必要です。あなたが正しく、この実装を使用することはできません示すprovided == MPI_THREAD_SINGLE
を返さなければなりません準拠したスレッドされていない
int provided;
MPI_Init_thread(NULL, NULL, MPI_THREAD_FUNNELED, &provided);
if (provided < MPI_THREAD_FUNNELED)
MPI_Abort(MPI_COMM_WORLD, -1);
A MPIライブラリ:
良い測定のためには、次の代わりMPI_Init
を呼び出す必要がありますあなたのコード。
実際には、一般的な実装でうまくいくはずです。スレッドサポートのさまざまなレベルの詳細については、MPI標準の12.4.3を参照してください。スレッドサポートのレベルが高くなると、選択した実装に応じて走行距離が異なることがあります。
私はそれに何か間違っているとは思わないが、私はこれの目的は何か疑問に思う。 –
また、より良いインターフェースのために[Boost.MPI](http://www.boost.org/doc/libs/1_65_1/doc/html/mpi.html)を使用することもできます。 –
私は今のところ午前ですが、Boost.MPIには独自の問題があります。多くの場合、何が起こっているのかを推測するために、MPIのドキュメンテーションに戻らなければなりません。 – OutOfBound