問題タブ [mpi-rma]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
4 に答える
3742 参照

c++ - MPIプロセス間で同期を維持するカウンターの作成

私は、基本的な通信およびグループMPI2メソッドを使用した経験が豊富で、MPIを使用して驚異的並列シミュレーション作業をかなり行っています。これまで、ディスパッチノードと多数のワーカーノードを持つようにコードを構造化してきました。ディスパッチノードには、シミュレーターで実行されるパラメーターファイルのリストがあります。各ワーカーノードにパラメータファイルをシードします。ワーカーノードはシミュレーションを実行してから、ディスパッチノードが提供する別のパラメーターファイルを要求します。すべてのパラメータファイルが実行されると、ディスパッチノードは各ワーカーノードをシャットダウンしてから、自身をシャットダウンします。

パラメータファイルの名前は通常「Par_N.txt」です。ここで、Nは識別整数です(例:N = 1-1000)。そのため、カウンターを作成し、このカウンターをすべてのノード間で同期させることができれば、ディスパッチノードを用意する必要がなくなり、システムをもう少しシンプルにすることができると考えていました。これは理論的には単純に聞こえますが、実際には、変更中などにカウンターがロックされていることを確認する必要があるため、少し難しいと思います。MPIに組み込みの方法があるのではないかと考えました。対応しろ。何かご意見は?私はこれを考えすぎていますか?

0 投票する
1 に答える
171 参照

performance - MPI-2 による片面通信

中間共有変数を使用して 2 つのスレッド間でプライベート データを転送する OpenMP コードの次のフラグメントを考えてみましょう。

私は(疑似コードで)片面メッセージパッシングライブラリを使用して、あるプロセスから別のプロセスにプライベートデータを転送する必要があります。何か案は?

0 投票する
1 に答える
1191 参照

fortran - MPI-2 の RMA 関数を使用した Fortran プログラムのセグメンテーション エラー

次の短い Fortran90 プログラムは、MPI_GET 呼び出しが含まれている限りクラッシュします。ランク 1 はランク 0 から値を読み取ろうとし、MPI_WIN_UNLOCK でハングします。ランク 0 の試みは、セグメンテーション違反により MPI_BARRIER でクラッシュします。

コマンドの構文を繰り返し確認しましたが、正しいようです。C/C++ の同様のコードは、同じシステムで動作します。

OpenMPI 1.4.3 と gfortran 4.4.5 を使用しています。

0 投票する
2 に答える
428 参照

synchronization - MPI では、エラー メッセージの stdout をロックします

エラー条件が満たされたときに、特定の MPI ランクでプログラムがエラー メッセージを生成することがあります。ただし、この条件は一部の (すべてではない) ランクでのみ満たされる可能性があります。エラー状態に遭遇した最初のランクからメッセージを出力し、他のランクから同様のメッセージを破棄したい。

私が単純に(メッセージを捨てずに)これをした場合、例えば

画面上でランダムに並べられた出力が表示されます。

ブロックに入る最初のプロセスの標準出力をロックしたいのですが、if(error)すべてのプロセスがそのブロックに入るわけではないという事実によって複雑になります。これは、MPI_Barrier() 集合が完了しないことを意味します。すべての出力を 1 つのプロセッサのみに送信することは、実際には解決策ではありません。これは、エラー メッセージが生成されるコード内のすべての場所で同期が必要になり、プログラムの速度が低下するためです。メッセージを出力するためだけにアイドル プロセッサを別に設定することも魅力的ではないようです (これはコミュニティ コードのためです)。ランクごとに 1 つのファイルに書き込むことも、少なくともランクが多数ある場合はオプションではありません。

MPIにアトミックメカニズムがあるかどうか疑問に思っていました(MPI3にあると読みました)。これにより、たとえば一方的な通信を介して、1つのプロセッサのメモリのフラグをアトミックに更新し、エラーメッセージの出力のみを続行できます。フラグはまだ設定されていません。

残念ながら、これは標準的なトリックでは簡単に達成できません... そうですか?

アップデート:

やり方がわかったと思います。Wesley の答えは近いものでしたが、ほとんどの MPI 実装で利用可能な標準の MPI2 RMA で行うこともできます。ソリューションの鍵は、MPICH2 ディストリビューション (test/mpi/rma/fetchandadd.c) にも含まれている Using MPI2 book のアトミックな例にあります。

変数 (ランク 0 に存在する) をロックしてアトミックにインクリメントする方法は次のとおりです。

そして初期化中のどこか:

...そして終了する前に

0 投票する
1 に答える
159 参照

fortran - 別のプロセッサからの変数の呼び出し

Fortran77 で並列プログラムを書いています。次の問題があります。

  1. N 個のプロセッサがあります。
  2. 各プロセッサには、サイズ S の配列 A が含まれています。
  3. すべてのプロセッサ (ランク X など) で何らかの関数を使用して、2 つの整数 Y と Z の値を計算します。ここで、Z < S (Y と Z の値はプロセッサごとに異なります)。
  4. プロセッサ Y の A(Z) の値をプロセッサ X に取得したいと考えています。

最初にプロセッサ X からプロセッサ Y に数値 X を送信し、次にプロセッサ Y からプロセッサ X に A(Z) を送信することを考えました。どのプロセッサから数値 X を受け取るかを知っています。

試してみましたが、このアクションを実装できるコードを思いつくことができませんでした。だから私はコードを投稿していません。

編集:

例を挙げて説明しようと思います。プロセッサ X=(たとえば 2) を使用しているとします。プロセッサ 2 で、2 つの整数 Y=(たとえば 34) と Z=say(5) の値を計算します。プロセッサ 2 での計算にプロセッサ 34 の A(5) の値を使用したいのですが、どうすればよいですか?

編集:

MPI フォーラムの誰かが、mpi_get の使用法を非常に明確に示す次のコードを提供してくれました。

0 投票する
1 に答える
688 参照

c++ - MPI2 / MPI3: MPI_allgather vs MPI 同期を考慮した片側通信

MPI-2 を使用して最適化プログラムを作成しています。このプログラムでは、(概念的に)std::vector等しい長さstd::vectorの s をすべてのプロセスで共有する必要があります。このベクトルは、k 現在見つかっている問題の最適解を保持し、多くの MPI プロセスの 1 つによって新しい最適解が見つかるたびに更新されます。通常、新しいソリューションを見つけるために各プロセスが費やす時間は大きく異なります。

MPI_allgather私の質問は、同期と待機のパフォーマンスの問題を考慮して、新しい最適なソリューションが見つかるたびにMPI 集合を使用する必要があるかどうかです。または、MPI-2 で One-Sided-Communications を使用して、すべてのプロセス間で「共有」ベクトルを維持する必要があります。

特に、私が を使用する場合MPI_allgather、プロセスは早期にジョブを終了してアイドル状態になり、他のプロセスとの何らかの同期を待ちますか?

MPI ポイントツーポイント通信 (upd: と UPC) の実務経験はありますが、実際のコーディングではコレクティブや片側通信を使用したことはありません。私は SO を検索し、 MPI_allgathersに関する関連する質問/回答を見つけまし。しかし、2 つのアプローチの正確な違いを伝えるのに苦労しています。

ありがとう、

- - アップデート - -

特に、「 MPI プロセス全体で同期を維持するカウンターの作成」のコード例を最後に示します。これは、片側を使用して単一のint「共有」を維持します。dataジェネリック型で機能するように適応させようとしましたが、元のコードと配列を維持する理由、およびユーザー関数に一般化する方法を理解するのに苦労しているため、機能させる方法がわかりませんMPI_Accumulate(単に古いベクトルと新しいベクトル)。

テンプレート //注: T は、int や double などのプリミティブ型 (ポインター、ref、または構造体ではない) のみにすることができます。struct mpi_array { typedef std::vector ベクトル; MPI_Win 勝つ; int ホストランク;
int ランク;
int サイズ;
ベクトル値;
ベクトル *hostvals; };


片側通信カウンター コード:

0 投票する
1 に答える
461 参照

c++ - MPI-2+ で MPI_Accumulate の機能を複製する方法

MPI-2/MPI-3 で導入された MPI の片側通信を学習していて、次のオンライン コース ページに出会いましたMPI_Accumulate

MPI_Accumulate を使用すると、呼び出し元は、ターゲット プロセスに移動されたデータを、ターゲット プロセスでの合計の累積など、既に存在するデータと組み合わせることができます。同じ機能は、MPI_Get を使用してデータを取得することで実現できます (同期が続きます)。呼び出し元で合計操作を実行します。次に、MPI_Put を使用して、更新されたデータをターゲット プロセスに送り返します。Accumulate はこの混乱を単純化します ...

ただし、MPI_Accumulate(max、min、sum、product など) と共に使用できる操作は限られており、ユーザー定義の操作は許可されていません。、sync、op、およびを使用して、上記の乱雑さを実装する方法を考えていました。C/C++ のチュートリアルや実用的なコード例はありますか?MPI_GetMPI_Put

ありがとう


テストするために、このSO questionのコードを適用しました。このコードでは、MPI プロセス間で同期が維持される整数カウンターを作成するために片側通信が使用されます。使用している対象の問題行MPI_Accumulateがマークされています。

コードはそのままコンパイルされ、約 15 秒で返されます。MPI_Accumulateしかし、問題行の直後のコメント ブロックに示されているように、同等の一連の基本操作に置き換えようとすると、コンパイルされたプログラムが無期限にハングします。

何がうまくいかなかったのかMPI_Accumulate、このコンテキストで置き換える正しい方法は何ですか?

PS私はコードをコンパイルしました

でバイナリを実行しました


コード:

もう 1 つ質問がMPI_Win_fenceあります。ここでは、ロックの代わりに使用する必要がありますか?

- 編集 -

次のようにロック/ロック解除を使用しましincrement_counterた。プログラムは実行されますが、奇妙な動作をします。最終的な出力では、マスター ノードがすべての作業を行います。まだ混乱しています。

0 投票する
1 に答える
91 参照

c++ - MPI-2 の片側通信で単一の int 値を同期する際の問題

MPI-2 の片側通信を学習する (一連の) 試みで、次のコードをテストしています。このコードではint、マスター プロセスなどの 1 つの基本的な型の値を保存し、それを他のすべてのプロセスに公開します。整数に対して行うことは簡単です。共有整数が最大値に達するまで、各プロセスで繰り返しインクリメントします。各プロセスは、次のように、共有整数を出力する前にフェンシングします (下部の完全なコード):

各プロセスが終了時に同じ値 ( 25) を出力することを期待しています。しかし、時々次のような出力が得られます。

ここで何が起こっているのか、正しく同期する方法を説明してもらえますか?

ありがとう、


コード: