問題タブ [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.
mpi - MPI_Win_fence がハングする
MPI を使用して、特定のアプリケーション用に一種の分散配列を実装しました。RMA (MPI_Get) を使用して、他のプロセスの責任下にある配列の部分の更新された値を取得しようとしました。チュートリアルで指定されていることを実行しました: MPI_Win_create MPI_Win_fence 一連の MPI_Get (プロセスごとに約 8.000)
問題は、すべてのプロセスが 2 番目の MPI_Win_fence でハングし、戻らないことです。誰でも助けてもらえますか?MPI_Get の数が問題ですか?
よろしく、 アデニルソ
c - MPI_Put を使用した非同期有限差分スキーム
Donzis と Aditya による論文では、ステンシルで遅延が発生する可能性のある有限差分スキームを使用できることが示唆されています。これは何を意味するのでしょうか?FDスキームを使用して、熱方程式と読み取り(またはその単純化)を解くことができます
つまり、次のタイム ステップでの値は、前のタイム ステップでの同じ位置とその近傍の値に依存します。
この問題は、ドメイン (この場合は 1D) を異なるプロセッサに分割することで簡単に解決できます。ただし、要素u[t,i+-1]
は別のプロセッサでのみ使用できるため、プロセッサで境界ノードを計算する場合は通信が必要です。
この問題は、引用された論文から引用した次の図に示されています。
MPI 実装では、同期計算にMPI_Send
andを使用する場合があります。MPI_Recv
計算自体は割と簡単なので、ボトルネックになるのは通信です。
この問題の解決策は、論文に記載されています。
同期プロセスの代わりに、以前の時間ステップの値である可能性があるという事実にもかかわらず、利用可能な境界メモを取るだけです。その後、メソッドはまだ収束します (いくつかの仮定の下で)
私の仕事では、非同期 MPI ケースを実装したいと思います (これは論文の一部ではありません)。MPI_Send
とを使用した同期部分MPI_Recv
は正しく動作しています。隣接する要素のゴースト セルとして 2 つの要素でメモリを拡張し、送受信を介して必要な値を送信します。以下のコードは基本的に上の図の実装であり、計算前の各タイム ステップで実行されます。
さて、私は決して MPI の専門家ではありません。それがMPI_Put
非同期のケースに必要なものかもしれないと考え、少し読んで、次の実装を思いつきました。
時間ループの前:
タイム ループの内部:
これにより、必要な要素がウィンドウ、つまりboundary
(2 つの要素を持つ配列) 隣接するプロセッサに配置され、配列自体から値u[0]
が取得されますu[NpP+1]
。boundary
この実装は機能しており、 と同じ結果が得られMPI_Send/Recv
ます。ただし、これは実際には非同期ではありません。これは、MPI_Win_fence
私が理解している限り、同期を保証する をまだ使用しているためです。
MPI_Win_fence
問題は次のとおりです。内部の値を取り出すと、boundary
更新されず、初期値のままになります。私の理解では、近隣のプロセッサによって更新された可能性がある (または更新されていない可能性がある)MPI_Win_fence
内部で利用可能な値を取得しないと、ということでした。boundary
内部の値が決して更新されないMPI_Win_fence
という問題を解決しながら、の使用を避けるためのアイデアはありますか?boundary
私が提供したコードが私の問題を理解するのに十分であるか、またはヒントを与えるのに十分かどうかもわかりません。その場合は、不足しているパーツをすべて追加しようとしますので、お気軽にお問い合わせください。
c - 分散データの MPI_Put
MPI-2 の機能を片面通信に使用して、分散ハッシュ テーブルのプログラムを作成しようとしています。各プロセスは、最初にメモリ (B) を他のすべてのプロセスに公開します。次に、うまくいけば、各プロセスが同期せずに他のプロセスのメモリにアクセスできるようになります。これまでのところ、私が持っているものを以下に示します ( http://mpi.deino.net/mpi_functions/MPI_Put.htmlの例から変更されたコード)。最後に、B[99] の値が間違っている場合があります (実行ごとに異なります)。私は何を間違っていますか?
編集: 最後に待機呼び出しを使用して上記の問題を修正しましたが、各 MPI_Get 呼び出しの完了を待ちたいと思います。しかし、唯一のオプションは、グローバル同期を必要とする MPI_Win_fence か、各 MPI_Get 呼び出しの MPI_Win_start/MPI_Win_complete のようです。以下に示すように後者を 1 回呼び出して、各 MPI_Get 呼び出しの後に何らかの形で待機することは可能ですか?
mpi - MPI リモート アクセス メモリ
MPI 3.0 のリモート アクセス メモリについては、MPI_Put と MPI_Get の 2 つの通信呼び出しがあります。以下を使用して、ローカル データを共有メモリに格納します (説明のために、 https://software.intel.com/en-us/blogs/2014/08/06/one-sided-communicationからいくつかのステートメントをコピーしました)。
ここで、num_procs はプロセッサーの数、id はプロセッサーのランクです。それらはそれぞれ以下から返されます。
MPI_Put の後、各プロセッサからのデータを共有メモリに配置する必要があります。次に、私のコードは、この共有メモリからデータを取得したいと考えています
私の質問は、NUM_ELEMENT とは異なる NUM_ELEMENT_get でケースを実行することは可能ですか? これは、同じプロセッサが共有メモリから取得するデータの数と、送信するデータの数が異なることを意味します。これに関するもう 1 つの問題は、個々のプロセッサが取得するデータが異なるプロセッサから送信される可能性があることです。では、上記の MPI_Get 呼び出しで id-1 と num_procs-1 の引数を指定するにはどうすればよいでしょうか? 私はこれを実装しようとはしていませんが、私のコードでの MPI 実装の設計について考えています。
どうもありがとう。
mpi - MPI: MPI_Get が機能しない
次のコードは、プロセス 0 (マスター) にウィンドウを作成し、他のプロセスがいくつかの値を入れて、印刷するたびに他のプロセスからマスターのウィンドウを取得しようとしていますが、完全に混乱する結果が得られます。コードは次のとおりです。
これにより、実際には次の結果が得られます。
私のコードの何が問題なのかを教えてください。ありがとう。
編集:どうやら問題は、MPI_Get が「ローカル」バッファーを満たさないことです...
algorithm - MPI: 共有メモリ (RMA) への排他的アクセスを確保する
MPI で n 個のプロセス間で共有リソース (メモリ ウィンドウなど) への排他的アクセスを保証する最善の方法を教えてください。MPI_Win_lock と MPI_Win_fence を試しましたが、期待どおりに動作しないようです。つまり、複数のプロセスがクリティカル領域 (MPI_Win_lock と MPI_Win_unlock の間の MPI_Get および/または MPI_Put を含むコード) に同時に入ることがわかります。
ご提案いただければ幸いです。ありがとう。
c++ - マスター スレッドは、すべてのスレッドに対して MPI_Win_lock_all() を 1 回呼び出すことができますか?
MPI-3 リモート メモリ アクセス機能を備えたハイブリッド MPI/OpenMP コードを作成しています。MPI_THREAD_SERIALIZED が利用可能であると想定しています。
これはできますか?
ここで、メイン スレッドは、MPI プロセス全体に対して lock と unlock を 1 回呼び出します。OMP スレッドは、必要に応じて MPI_Get を呼び出します。MPI_Get ごとに lock と unlock を呼び出すこともできますが、時間がかかると思います。
動作しているようです。しかし、これが正しい使い方かどうかはわかりません。
mpi - MPI_Win_attach でアタッチできるメモリ量の実際の制限は?
MPI 3.1 標準の次のビットに気付きました。
ユーザーへのアドバイス。ウィンドウにメモリをアタッチするには、限られたリソースを使用する必要がある場合があります。したがって、移植可能なプログラムでは、大規模なメモリ領域をアタッチすることはお勧めしません。
実装者へのアドバイス。高品質の実装では、できるだけ多くのメモリを接続に使用できるようにしようとします。
さまざまな実装 (つまり、MPICH、Cray MPICH、OpenMPI、SGI MPT、および Intel MPI) の MPI_Win_attach のマニュアル ページを見てきましたが、それらの実装のメモリ量に関する文書化された制限は見当たりませんでした。メモリを装着可能。ここで与えられた「ユーザーへのアドバイス」については、あまり心配する必要はありませんか?