8

関数でマルチプロセスを使用したいのですが、どうすれば作成できますか。

ご存じのように、MPI_Init には "int argc, char **argv" という 2 つのパラメーターが必要です。これら 2 つのパラメーターを関数定義に追加する必要があるということですか?

私の要件は、メインプログラムのステップではなく、関数のステップを並列化したいということです。

例えば、

func(mat &A, vec &x) {
  some computation on A;
  auto B = sub_mat(A, 0, 10);
  B*x; // I want to parallelize this computation
}
main(){
  mat A;
  vec x;
  func(A, x);
}

B*x で MPI を使用したいだけですが、MPI を初期化する方法がわかりません。ところで、MPI int func を初期化できれば、このときすべてのプロセスに A は存在するのでしょうか?

助けて&ありがとう!

4

2 に答える 2

11

MPI-2 は MPI-1 の制限を解除したため、コンパイル済みの実装では引数がへの引数と同じである必要がある場合argcがあるため、パスアンドアラウンドを行う必要はありません。argvMPI_Initmain

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 プロセスが相互に認識し、相互に通信できるようにするだけです。これにより、特定の問題を解決するためにそれらが集合的に機能できるようになります。

于 2012-07-28T14:27:08.860 に答える
0

MPI_Initサブ関数で使用する場合は、関数に渡す必要int argc, char **argvがあります。

ただし、サブ関数の一部を並列化したいだけの場合でもMPI_Init、プログラムの早い段階で使用できます (より透過的なコードを使用する必要があります)。たとえば、他の初期化が完了した後、または並列化された関数の近くで使用したい場合、関数を呼び出す直前。

argc原則として、関数はandについて知る必要はありませんargvね。

于 2012-07-28T12:26:56.080 に答える