0

行列を計算するためのスキームについて考えるのに時間を費やしましたが、すべてが理にかなっていますが、処理方法がわからない最後の部分が 1 つあります。

これが私がやろうとしていることです(シナリオ):

  1. 10(w)x5(h) 行列を計算するように求められました。
  2. 10 個のプロセッサが利用可能です。
  3. ランク 0 の proc を含む個々のプロセッサで 1x5 行列を宣言します。
  4. 各プロセッサの各サブマトリックスをオフセットして計算します。
  5. MPI_Barrier は、10 個のプロセッサすべてが計算を終了するまで待機します。
  6. 完全な行列を表示します。

    ステップ 5 までは順調に進んでいますが、障壁を越えて何をすればよいかわかりません。完全な 10x5 マトリクスを備えたプロセッサはありません。最初は、必要ないと思っていたのですが、次のようなものが欲しかったのです。

      foreach(procX in proc(0-9))
          showColumn(procX)
    

しかし、MPI_Barrier の後にどのプロセッサが呼び出されるのかわかりません。また、プロセッサの順序を念頭に置いて印刷する方法もわかりません (そうしないと、行列が正しく印刷されません)。

これを通常に処理する方法について誰かが考えを持っていますか? 各プロセッサがマトリックスの一部で動作するようにすることについて多くのことを読みましたが、それらの異なる部分を組み合わせる方法については何も見つかりませんでした.

コードでスキャッターを使用していない (つまり、マスター スレーブ手法を使用していない)

ありがとう

4

2 に答える 2

2

suszterpatt の回答のように、各ランクに独自のローカル部分を出力して同期させることは可能ですが、MPI 標準の一部ではない機能に依存しているため、常に機能することが保証されておらず、診断用途にのみ推奨されます。

まず、ランク 0 以外のランクを標準出力に送信することを許可しないマシンとそれに対応する MPI 実装があります。次に、すべてのランクの標準出力がmpiexecプロセスにリダイレクトされる場合でも、通常はバッファリングされます。したがって、バリアを使用して印刷の順序が強制されている場合でも、ランクからの標準出力がランクからi+1の出力の前に表示される可能性があります。iつまり、MPI は明示的なフラッシュ操作 (たとえば のようなものfflush(stdout)) を提供しません。これにより、ローカルの標準出力バッファーが強制的に送信mpiexecされ、後者によって表示される可能性があります。それを処理する方法を決定するのは実装次第です。

これを行うためのより標準に準拠した方法は、各ランクが行列のその部分をランク 0 に送信するようにすることです。これにより、次のように出力されます。

if (rank == 0)
{
   allocate temp_buffer;
   for (i = 1; i < num_procs; i++)
   {
       receive from rank i into temp_buffer
       print temp_buffer
   }
}
else
{
   send local matrix part to rank 0
}

そうすれば、明示的なバリア同期は使用されず、1 つのプロセスのみが表示される行の順序を出力するため、保証されます。

もう 1 つのオプションは、各ランクがローカル文字列バッファーに出力するようにすることです (例: sprintf- を使用)。次にバッファーをランク 0 に送信し、受信した文字列をランク 0 に表示します。

于 2013-11-02T13:06:54.243 に答える