タグ付けされた質問 「mpi」

メッセージパッシングインターフェイス-分散メモリシステム用の標準的で移植性の高い並列プログラミングインターフェイス。

5
ユーザーがMPI C ++インターフェイスから必要とする機能は何ですか?
MPI標準の3.0バージョンは、C ++インターフェイスを正式に削除しました(以前は非推奨でした)。実装では引き続きサポートされますが、MPI-3の新しい機能には、MPI標準で定義されたC ++インターフェイスがありません。詳細については、http://blogs.cisco.com/performance/the-mpi-c-bindings-what-happened-and-why/を参照してください。 MPIからC ++インターフェースを削除する動機は、Cインターフェースよりも大きな価値がないことでした。「s / _ / :: / g」以外の違いはほとんどなく、C ++ユーザーが慣れている多くの機能は使用されませんでした(テンプレートによる自動型判別など)。 MPIフォーラムに参加し、MPI C関数への独自のC ++インターフェイスを実装している多くのC ++プロジェクトで作業している人として、MPIへのC ++インターフェイスの望ましい機能を知りたいと思います。私は何も約束しませんが、多くのユーザーのニーズを満たすスタンドアロンのMPI C ++インターフェイスの実装に興味があります。 はい、Boost :: MPI(http://www.boost.org/doc/libs/1_54_0/doc/html/mpi.html)に精通していますが、MPI-1機能のみをサポートしており、シリアル化モデルはRMAのサポートは非​​常に困難です。 私が気に入っているMPIへのC ++インターフェイスの1つは、Elemental(https://github.com/poulson/Elemental/blob/master/src/core/imports/mpi.cpp)のインターフェイスです。アプローチ。特に、MpiMapは本質的な問題を解決すると思います。
28 c++  mpi 

3
パラレルI / Oオプション、特にパラレルHDF5
簡単に並列化できるアプリケーションがありますが、そのパフォーマンスは大部分がI / Oバウンドです。アプリケーションは、通常2〜5 GBのサイズのファイルに格納されている単一の入力配列を読み取ります(ただし、この数値は将来的に増加する予定です)。典型的な計算では、その配列の各行または列に同じ操作が適用されます。CPUを大量に使用する操作では、約100プロセッサまで非常に優れたスケーリングが得られますが、遅い操作ではI / Oおよび関連する通信(NFSアクセス)が支配的であり、少数のプロセッサしか効率的に使用できません。 そのような状況で効率的でポータブルな(理想的には移植性の高い)オプションは何ですか?並列HDF5は有望なようです。誰かがそれを実際に体験したことがありますか? MPI-I / Oは検討する価値があるでしょうか?特定のファイルレイアウトで効率的に動作することはできますか、それともすべてを適応させる必要がありますか?

2
Boost :: mpiまたは高性能科学アプリケーション向けのC MPI?
私がMPIで最も嫌いなのは、データ型(データマップ/マスク)を扱うことです。なぜなら、それらはオブジェクト指向のC ++にうまく適合しないからです。boost::mpiただし、WebサイトからはMPI 1.1のみをサポートしています。 boost :: mpiは、標準のメッセージパッシングインターフェイスに対するC ++フレンドリーなインターフェイスです。Boost.MPIは、Boost.Serializationライブラリを使用して、ユーザー定義型のMPIデータ型を構築できます。 boost::mpi本格的な科学コンピューティングの経験はありますか?お勧めしますか?問題(スケーリングの問題、コンパイラの問題、エラー、実装されていない機能、いくつかのmpi 2.2機能の必要性)がありましたか? boost::mpiC ++のMPI C実装を使用する代わりに使用についてコメントできますか?両方を組み合わせることができます(可能な場合はboost :: mpiを使用し、他の場所ではC-MPIを使用します)。 を使用して大きな科学的コードを知っていboost::mpiますか?
16 hpc  c++  mpi 

1
OpenMPなどの共有メモリモードでMPI-3.0を実行する方法
5次元の人口バランスモデルを数値的に解くためにコードを並列化します。現在、FORTRANには非常に優れたMPICH2並列化コードがありますが、パラメーター値を大きくすると、配列が大きくなりすぎて分散メモリモードで実行できなくなります。 15ノードのクラスターにアクセスできます。各ノードには2つの8コアCPUと128GBのRAMがあります。共有メモリモードでMPI-3.0を使用してプログラムを実行し、各プロセスが各アレイの独自のコピーを生成しないようにしたいと思います。 クラスターで何かを実行する前に、Ubuntuを実行しているデスクトップでテストする必要があります。2つの8コアCPUと128 GBのRAMを備えているという点で、本質的にクラスターの1つのブレードです。コードを書いてテストしますので、Ubuntuコンピューターでプログラムを実行するように応答してください。 MPI-3.0をデフォルトの分散メモリモードの代わりにOpenMPのような共有メモリモードで実行する方法があることを読みました。 質問: コードを変更するにはどうすればよいですか?次のような他のMPI関数への呼び出しを追加する必要がありMPI_WIN_ALLOCATEますか? 共有メモリモードでMPI-3.0を実行するようにコードをコンパイルするにはどうすればよいですか?複数のノードにまたがる場合、これは異なりますか? 可能な場合は、サンプルのコンパイルスクリプトを提供してください。また、GNUコンパイラしかありません。私が使用しているクラスターは、Intelコンパイラーをサポートしていません。

4
MPIを使用するコード/ライブラリと互換性のある単体テストフレームワークに関する推奨事項はありますか?
通常、シリアルコードを記述し、その際に、xUnitスタイルのテストフレームワーク(MATLAB xUnit、PyUnit / nose、またはGoogleのC ++テストフレームワーク)を使用してユニットテストを記述します。 Googleの大まかな検索に基づいて、実務家がMPIを使用するコードを単体テストする方法についてはあまり見ていません。そのためのベストプラクティスはありますか? ユニットテストとテスト駆動開発の戦略と比較して、テストフレームワークに使用するソフトウェアに関する答えを探しています(存在する場合-答えは「独自のコードをロール」することができます)カスタムテストコードの事例が参考になります)。 私がテストしようとしているもののほとんどは、右側の関数評価と半離散化PDEを統合するタイムステッパーのヤコビ行列アセンブリルーチンです。私はPETScを使用するので、PETSc固有のものがあれば、より一般的なテストフレームワークに加えて役立ちます。 明確化の編集: 例はにあり${PETSC_DIR}/src/ts/examples/tutorials/ex2.c、ここでRHSFunction(右側の関数評価)などのテストを行います。RHSJacobian(ヤコビ行列の評価)。私は、組み立てられた右側と組み立てられたヤコビ行列の既知の値に対してテストします。いくつかの単純な問題の場合、これらの値を分析的に取得できます。これらの関数は、他のアプリケーションレベルの関数を実行しないアプリケーション固有の関数ですが、関数内でベクトルまたは行列のアセンブリが実行されると、MPIを呼び出すことができます(上記のリンクされたPETScの例のように)。プロセッサにローカルなベクトルまたは行列の一部のみを計算する関数を作成する場合、可能な場合はグローバルなアセンブルバージョンに対してテストする必要があります。これは、パラレルプログラミングが初めてなので、グローバルなベクトルとグローバルについて考える方が直感的だからです。マトリックス。これらのテストは、小さな問題サイズと少数のプロセッサーで実行されます。 これを行うためのいくつかの戦略を考えることができます。 このトピックで行ったGoogleの検索に基づいて、おそらくうまく機能しない戦略は、既知の出力を構築し、相対/絶対エラーを並行して見つけ、単純な比較を行うことです。MPIを使用して「Hello、world」プログラムを作成した人なら誰でも、出力が文字化けする可能性があります。これは、単体テストの実行の有用性を制限します。(これが質問をするきっかけになりました。)単体テストフレームワークの呼び出しには、潜在的なトリッキーさもあるようです。 出力をファイルに書き込み(たとえば、PETScでVecViewand を使用してMatView)、ndiffまたはのような既知の出力と比較しnumdiffます。ファイル比較を使用して単体テストを行った以前の経験から得たこのメソッドの直感は、細心の注意が必要であり、フィルタリングが必要になるということです。ただし、上記のユーティリティをプレーンdiffに置き換えることができ、テキスト形式の一致を心配する必要がないため、この方法は回帰テストに優れているようです。この戦略は、WolfgangBangerthとandybauerが提案しているものと多かれ少なかれだと思いました。また、PETScは、一部のテストで同様のアプローチを使用しているようです。 単体テストフレームワークを使用して、MPIランク0のプロセッサにすべてを収集し、プロセッサランクが0の場合にのみ単体テストを実行するように依頼します。標準で同様のことができます(おそらく、その方が簡単です)返されたエラーは、計算に問題があることを示しますが、どの要素にエラーがあるかはわかりません。そうすれば、ユニットテストの出力が文字化けすることを心配する必要はありません。単体テストフレームワークを正しく呼び出すことだけを心配する必要があります。PETScは、正確なソリューションが利用可能な場合、サンプルプログラム内で標準的な比較を使用するように見えますが、それらの比較を行うときにユニットテストフレームワークを使用しません(必ずしもそうする必要はありません)。

2
mpi_allgather操作の計算コストは​​、ギャザー/スキャッター操作と比較してどうですか?
単一のmpi_allgather操作または1つのmpi_scatterと1つのmpi_gather操作を使用して並列化できる問題に取り組んでいます。これらの操作はwhileループ内で呼び出されるため、何度も呼び出される場合があります。 MPI_allgatherスキームを使用した実装では、重複する行列を解決するために、分散ベクトルをすべてのプロセスに収集しています。もう1つの実装では、分散ベクトルを単一のプロセッサ(ルートノード)に収集し、このプロセッサで線形システムを解き、ソリューションベクトルをすべてのプロセスに分散させます。 収集操作のコストが、分散操作と収集操作を合わせたものよりもかなり大きいかどうか知りたいです。メッセージの長さは、その複雑さにおいて重要な役割を果たしていますか?mpiの実装によって異なりますか? 編集:

3
パフォーマンスの問題を検索してイベントデータを視覚化する方法
高度に非同期の通信パターンでMPIアプリケーションを最適化しようとしています。各ランクには計算するもののリストがあり、入力または出力が異なるランクにある場合は、必要に応じてメッセージを送信します。さらに、各ランクはスレッド化されています(現在、1つの通信スレッドと5つのワーカー)。 コードのさまざまなパフォーマンスクリティカルな部分にタイマーを使用してコードをインストルメント化しました。これにより、各スレッドの(開始、終了、タイプ)トリプルのリストが表示されます。横軸を時間、縦軸をランクとスレッド、そして各スレッドが現在何をしているかを示す色で、わかりやすい方法でプロットすると、6スレッド/ランクの16ランクで次のような画像が得られます。 私の質問は、パフォーマンスの問題を突き止めるのに役立つこのデータを視覚化する他の方法は何ですか?誰かが非同期アプリケーションのプロファイリングに使用するお気に入りのタイプのプロットを持っていますか? このデータセットは、データフロー構造を認識していないという点で制限されていますが、より複雑なものを収集する前に、できる限り多くの洞察を得たいと思います。 誰もが見回したい場合に備えて、非圧縮画像がここにあります(通常のルートでアップロードできませんでした)。残念ながら、Firefoxは有効であると私が信じているにもかかわらず、それを受け入れません。おそらくそれが単に大きすぎるためです。

2
スーパーコンピューティングにおける通信オーバーヘッド
私は、スーパーコンピューターが実際のタスク関連の作業を行うのではなく、調整に費やすリソースを説明する信頼できるリファレンスを探しています。リソースは利用可能な処理能力である可能性がありますが、ワットでさえ有効な単位のようです。 私の教授または教科書の1つがかつて超並列システムでは、利用可能な処理能力の最大半分がタスクとメッセージパッシングの調整に費やされていると言っていたと思います。残念ながら、私はこの参考文献やこの比率に関する他の資料を見つけることができないようです。 これはスーパーコンピューターのアーキテクチャによって大きく異なり、最新の実装はおそらくこの点でより効率的であるため、複数のアーキテクチャまたは進化(専用メッセージパッシングハードウェアの前後)にわたるこのメトリックの概要はさらに優れていると思います。
9 hpc  mpi 


2
コマンドライン引数をMPI_Initに渡す必要がありますか?
MPI 3.0のコードを書くとき、私は合格しなければならないargcとargvのMPI_Init通話やない、なぜ? 編集:ビル・バースの答えはいくつかの質問を提起したので、私はいくつかの発言をしたいと思います: MPI 1.1以降、argc/を渡すargv必要はありません。 質問は、具体的理由/ 1パスすべきでない程度であるargc/ argv(なぜあなたはいけません、本当にその後、答えではありません)。 それでも、argc/ argvを渡すことができない場合がありますMPI_Init(mainが制御範囲外にあり、MPIが実装の詳細である場合、静的初期化を使用してMPIを起動するライブラリを作成します)。 EDIT2:なぜ使用しないのかMPI_Init(argc, argv)という質問が頻繁に出てきました。いくつかの理由: 古い/非準拠/準拠のMPI <1.1実装との互換性のためにこれを行うことはできません。MPI2またはMPI3機能を使用している場合、これらは機能しません。 MPI_Init() と同じ方法でMPIランタイムを初期化します MPI_Init(argc, argv) MPI_Init(argc, argv)MPIの実行時に渡される引数を削除argcし、argv そして MPIを初期化します。私の知る限り、それはきれいにするための唯一の方法であるargcとargvあなたがそれを使用する必要が全くMPI引数を持たないためにこれらが必要な場合はそう。 MPI_Init()より多くの状況で使用できますMPI_Init(argc, argv)。たとえば、MPIを実装の詳細として使用しているライブラリは、MPIが初期化されているかどうかをテストできます。初期化されていない場合は、呼び出すMPI_Init()と正しいことが起こります。あなたのユーザーは、あなたがMPIを使用していることを知らない、渡す必要はありませんargc、argv......あなたのライブラリーを使用するために、あなたのライブラリに、(場合には、それは引数を取っていない)自分のメインを変更する必要はありません。
8 c++  c  mpi 

1
複数の非同期転送のMPIポリシー
MPIでの複数の非同期非同期転送のポリシーは何ですか? いくつかの開いている非同期irecv操作を持つプログラムがあります。発生する可能性のある転送(対応するものisendが呼び出された)が、まだ準備ができisendていない(対応するものがまだ呼び出されていない)他の転送を待機していることがわかりました。明らかに、この非効率性はネットワークの競合に起因するものではありません。ネットワークが不必要にアイドル状態になっています。 私のプログラムは次のようになります。 マシン1 call irecv(variable A from machine 2) call irecv(variable B from machine 2) call irecv(variable C from machine 2) call wait(variable C from machine 2) call do_important_work_with(variable C) .... マシン2 call isend(variable C to machine 1) call isend(variable B to machine 1) call do a bunch of …

4
メッセージの受信をMPIプロセスに通知する効率的な方法は何ですか?
ではMPI、他のプロセスからメッセージを受信する必要があることをプロセスのグループに通知するための組み込みメカニズムはありますか? 私のアプリケーションでは、すべてのプロセスが既知のランクID(各反復で変更される可能性がある)を持つプロセスのグループにデータを送信する必要がありますが、メッセージを受信するプロセスのランクはわかりません。ありとあらゆるプロセスに問い合わせることなくこれを実現するポータブルな、できれば組み込みの方法はありますか?
8 mpi 

2
MPI 2のMPI_Barrierのノンブロッキングバージョン
要求メッセージをやり取りするMPIプロセスがたくさんあります。プロセスは、他のどのプロセスがメッセージを送信するのか、またはその数を知りません。このような状況で、他のすべてのプロセスが自分自身がメッセージの送信を完了したと見なしているかどうかを効率的に知る方法が欲しいのです。 これは、MPI_Barrierの次の非ブロッキングバージョンによって完全に達成されます。これをMPI_Ibarrierと呼びます。 int MPI_Ibarrier(MPI_Comm comm, MPI_Request* request); MPI_Ibarrier すぐに戻り、リクエストオブジェクトに対する標準操作により、全員がバリアに到達したことが通知されます。 MPI 2でこの動作を効率的にシミュレートする方法はありますか(つまり、公式のノンブロッキングコレクティブなし)。
8 mpi 

4
MPIメッセージに優先順位を付けることはできますか?
私が理解している限り、非ブロッキングポイントツーポイントMPIメッセージ(IsendおよびIrecv)が受信される順序は、それらが送信される順序と一致しています。特定のメッセージを他のメッセージよりも優先する方法はありますか? たとえば、マルチレベルアルゴリズムがあり、高解像度のソリューションがノンブロッキングコールで送信され、細かいメッセージが送信されている間に粗いレベルの計算が行われます。ただし、低解像度のソリューションを送信するときは、それらを優先してください(これらは本質的にブロックされています)。 また、エクサスケールに移行するときに、これが他のアルゴリズムに役立つ可能性があることも想像できます。一部のメッセージは「クリティカルパス」にあり、他のメッセージはそうではありません。
8 mpi 
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.