1

いくつかの導体の熱伝達を計算するコードがあります。1つのコンダクターで発生したことは、モデル内の他のコンダクターに影響を与えません。そのため、これらのコンダクターのソリューションを並列に実行し、各プロセッサーが異なるコンダクターのセットを使用するようにしようとしています。ここで、コマンドを配置するこのループに到達するまで、コードは1つのコアで実行することで機能すると思いました。

MPI_INIT

次に、要求したコアの数に応じてコードのこのセクションを実行し、コマンドの後に1つのコアでの実行に戻ります。

MPI_FINALIZE

に遭遇しました。しかし、私が見ているのは、入力ファイルが両方のコアによって読み込まれ(2つのコアを使用している場合)、すべての出力も2回出力されることです。MPIは思ったように動作しませんか?そうでない場合、どうすれば私が望む動作を実現できますか?コードのその1つのセグメントに対して複数のコアでコードを実行するだけで、MPI_INITおよびMPI_FINALIZE以外の他のサブルーチンやコードの一部では実行しないでください。

4

2 に答える 2

9

これはよくある誤解であり、特にOpenMPのように、プログラムのさまざまなポイントでスレッドが分岐して結合されるような経験をしている人の間ではよくあります。

MPIで、 MPIライブラリMPI_InitMPI_Finalize初期化してファイナライズします。それでおしまい。標準では、Initの前とFinalizeの後に何が起こるかについて意図的に沈黙していますが、実際問題として、mpirunまたはmpiexecコマンドは通常、プロセスの作成と起動を行います。入力した場合

mpirun -np 4 hostname

たとえば、4つのプロセスが起動され、それぞれがコマンドを実行します。これは、MPI実行可能ファイルではなく、または呼び出しが含まれhostnameていないことは間違いありません。これらの各プロセスは実行可能ファイルを最初から最後まで実行するため、4つの出力が得られます。プロセスを起動するのはmpirun(またはmpiexec)であり、プログラム内のMPI関数呼び出しではありません。MPI_InitMPI_Finalize

プログラムでは、プログラム全体が要求した数のプロセスによって実行されます。

于 2012-06-19T19:52:57.967 に答える
3

質問を完全に理解しているとは思いませんが、最初に注意すべきことは、MPI は最大で 1 回しか初期化できないということです。そう繰り返しやって

MPI_Init
...
MPI_Finalize

許可されていません。その上、MPI_InitそしてMPI_Finalize高価な操作です。それらをループで呼び出したくないでしょう。

MPI は当初、一連のプロセスが起動し、作業を行い、終了するという静的プロセス モデルを中心に設計されました。実行時にプロセス数を変更したいようです。これは MPI-2 で可能です (「参考文献」を参照MPI_Comm_spawn)。

一方、プロセスの継続的な起動とシャットダウンは遅くなります。プロセスが呼び出したからとMPI_Initいって、すべての通信に参加する必要があるわけではありません。これが私が問題に取り組む方法です:

  1. プロセスのプールを開始します。MPI_Initローカルでのみ動作するプロセスであっても、すべてのプロセスでプログラムの最初に呼び出します。
  2. 各ループ反復で、 を使用して通信する必要があるプロセス用に新しいコミュニケータを作成し、 のMPI_Comm_create代わりにすべての通信にそれを使用しますMPI_COMM_WORLD
  3. プログラムの最後に、すべてのプロセスが を呼び出しますMPI_Finalize
于 2012-06-19T19:50:04.120 に答える