MPI-2 は MPI-1 の制限を解除したため、コンパイル済みの実装では引数がへの引数と同じである必要がある場合argc
があるため、パスアンドアラウンドを行う必要はありません。argv
MPI_Init
main
MPI-2 実装では、この要件を課すことは許可されていません。NULL
アプリケーションがと の両方のargc
引数argv
を渡すことができるようにするには、MPI の適合する実装が必要ですmain
。
MPI_Init()
ただし、 (またはMPI_Init_thread()
) は 1 回しか呼び出されないため、MPI が既に初期化されているかどうかをテストする必要があります。これは を使用して行われるMPI_Initialized()
ため、コードは次のようになります。
int initialized, finalized;
MPI_Initialized(&initialized);
if (!initialized)
MPI_Init(NULL, NULL);
// Perform work in parallel
...
// You also need this when your program is about to exit
MPI_Finalized(&finalized);
if (!finalized)
MPI_Finalize();
MPI は、アプリケーションの存続期間全体で一度だけ初期化して終了できることに注意してください。つまりMPI_Init() ... MPI_Finalize()
、関数が複数回呼び出される場合、関数コードのブロックを囲んでも機能しません。つまり、MPI は、並列領域を持つ OpenMP と同じようには機能しません。
ところで、MPI int func を初期化できれば、このときすべてのプロセスに A は存在するのでしょうか?
実行中の MPI プログラムは、独自のプライベート アドレス空間を持つ複数のプロセスで構成されます。通常、これらは同じプログラム コードの複数のコピー (いわゆる Single Program Multiple Data または SPMD パラダイム) ですが、一緒に動作するように記述された複数のプログラムの複数のコピー (Multiple Programs Multiple Data または MPMD とも呼ばれます) である場合もあります。SPMD は、複数の方向に実行を分岐するために MPI ランクが使用されるポイントまで、すべてのプロセスがまったく同じコードを実行する、より単純でより一般的なケースです。はい、A
すべてのプロセスに存在し、前の計算に (疑似) 乱数/イベントが含まれていない場合A
、MPI ライブラリの初期化前にすべての MPI プロセスで同じ値になります。ご了承くださいMPI_Init()
他のライブラリ呼び出しと同様に、通常のライブラリ呼び出しです。ユーザーメモリの内容は変更されません。実行中の多数の MPI プロセスが相互に認識し、相互に通信できるようにするだけです。これにより、特定の問題を解決するためにそれらが集合的に機能できるようになります。