問題タブ [boost-mpi]
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.
c++ - Boost.MPI: 受信したものは送信したものではありません!
私は Boost MPI の使用に比較的慣れていません。ライブラリをインストールし、コードをコンパイルしましたが、非常に奇妙なエラーが発生しました - スレーブ ノードによって受信された一部の整数データが、マスターによって送信されたものではありません。何が起こっている?
私はブースト バージョン 1.42.0 を使用しており、mpic++ を使用してコードをコンパイルしています (これは、1 つのクラスターで g++ をラップし、もう 1 つのクラスターで icpc をラップします)。出力を含む簡略化された例を次に示します。
コード:
これを 21 ノード (1 マスター、20 スレーブ) で実行すると、次のようになります。
そのため、マスターがノード 1 に 0、ノード 2 に 1、ノード 3 に 2 などを送信している間、ほとんどのスレーブ ノードは (何らかの理由で) 数値 19 を受信します。 0 の 2 乗、1 の 2 乗、19 の 2 乗を 18 回取得します。
これを説明できる人に事前に感謝します。
アラン
boost - Boost.MPI と Boost.Asio
良い一日!
これらのライブラリの違いは何ですか?
私は MPI のドキュメントを読み、asio の経験はほとんどありません。私にとっては、ネットワーク通信のさまざまな実装であり、それ以上のものではありません。
しかし、それぞれが異なる抽象化を導入し(これらの抽象化の同じレベルについてはわかりません)、異なるアプリケーション設計につながります。
あるライブラリまたは別のライブラリをいつ使用する必要がありますか? それぞれの状況で正しい決定を選択するために知っておくべきことは何ですか?
はい、Asio はいくつかのノード (および一般的に非常に一般的なフレームワーク) に適していますが、なぜ MPI はそのようなタスクにあまり適していないのでしょうか? MPI C ライブラリへの依存が限定的だとか、MPI が理解しにくいとか、スケーラビリティについてはどうでしょうか。Asio を使用すると、放送などを実装できますが、一方で MPI は単純なネットワーク アプリケーションを作成することを禁止していません。必要に応じて MPI で Asio 固有のロジックを書き直すのは概念的に難しいですか?
ソケットのような通信についてはどうですか。必須の場合、Asio または他のフレームワークのモジュールにそのような通信をカプセル化し、他の通信に MPI を使用できます。
私にとって、ソケットと MPI 標準は異なるネットワーク サービスであり、単純なクライアント サーバー ペアからいくつかの中程度の計算までの距離が 1 つのステップである現実の世界で何が基本的なのかは明確ではありません。また、MPI は Asio に比べてオーバーヘッドが大きいとは思いません。
悪い質問かもしれませんが、必要なのは ICE (Internet Communications Engine) のようなものだけでしょうか? さまざまな言語がサポートされており、(ZeroC が保証するように) 優れたパフォーマンスがサポートされています。
もちろん、「このライブラリを使用しないでください!」などのドキュメント トピックは見たことがありません。
ある場合はソケット、別の場合は非同期メッセージ、そして最後に重いミドルウェア プラットフォームです。開発のライフサイクルにおける明快さはどこにありますか? 公平な質問ではないかもしれませんが、この動物園を縮小するには、ある程度のポイントが必要です。
c++ - Boost を使用して MPI の共有メモリを設計する
誰かが初心者向けのboost::mpiドキュメントを知っているかどうか尋ねたいですか? (私は既に Internet サイトから Boost.MPI のドキュメントを読んでいます)。
私のシステムについて少し説明します。約 90 ノットのクラスターがあり、各ノットには 2 つのコア (合計 4 つのコア) と 4Gb RAM を備えた 2 つの CPU があります。
各ノットに共有メモリを定義し、そこにベクトルを保存したいと思いますstd::vector<bool> occupation;
。次に、各プロセスは自分の数に基づいて何かを計算する必要がありrank()
ます。
ここで、すべてのマルチ プロセスは、すべてのコアが計算を完了するまで待機し、ベクトル をstd::vector<uint32_t> remove;
メイン プロセス ( rank() == 0
) に送信する必要があります。メイン プロセスはベクトルを更新occupation
し、すべてのノットに新しいoccupation
ベクトルを送信します。
mpi.h
の代わりに単純に使用した方がよい場合もありboost::mpi
ます。
私は MPI のこの分野での経験がないので、あなたの意見を聞きたいです。
c++ - Boost.MPI に、Boost.Serialization で使用するクラス バージョンを指定できますか?
プロセス間でメッセージを交換するために Boost.MPI を使用しています。各メッセージは、Boost.Serialization を使用してシリアル化されたクラスの 1 つを運びます。また、同じシリアライゼーション コードを使用して、そのクラスをファイルに保存します。MPI 経由で送信する必要があるものは、ファイルに保存する必要があるものよりも小さい (関連するメンバーが少ない)。シリアライゼーション ライブラリでサポートされているクラスのバージョン管理を使用して、Boost.MPI にデフォルト以外のバージョンのクラスを送信するように指示するとよいと考えていましたが、そうする方法が見つからないようです。これが可能かどうか知っていますか?
c++ - MPI: ファイルシステムへのアクセスを制限するには?
それぞれ 16 コアの 4 つのクラスターに基づく MPI があります。というフォルダがありますnotRestricted
。mpiexec で実行するアプリケーションのファイル システムへのアクセスを制限したい - アプリケーションを実行した 1 台のマシン上のその 1 つのフォルダーにのみ書き込みができるようにアクセスを制限します。
実行するアプリにコードを挿入することはできますが、それは本当にやりたいことではありません...そのため、微調整できるのは、mpi 設定/構成ファイルと、アプリを実行するために呼び出す mpiexec コマンドだけです。ここでの主な問題は、たとえば「open(2) の代わりを挿入する」と、望まない他のマシン fs へのアクセスを開いてしまうことです。
では、作成した mpi クラスターで mpi アプリケーションの権限を制限するにはどうすればよいでしょうか?
注:この質問はその質問に関連していますが、同じではありません。
c++ - C++ API によるマルチスレッド
私は OpenMP を使用して自分のプログラムを並列化しようとしていますが、行き止まりになっていると感じることがあります。
クラスで定義(および初期化)した関数メンバーで変数を共有したいと思います。私の理解が正しければ、クラス#pragma omp parallel shared(foo)
のデータ メンバー ( int
、boost::multi_array
および など) を実行することはできません。std::vector
例: クラスのベクター データ メンバーで push_back() を使用します。a の値を更新しますboost::multi_array
。
私の質問は、OpenMP が適切なツールであるかどうか、または boost::thread または tbb を使用する必要があるかどうかです。または何か... C++ APIをサポートするもの
よろしく
c++ - Intel MPI を使用した Boost.MPI のビルド
Intel MPI 4.0.0.012 で Boost.MPI 1.47 をビルドしようとしていますが、Boost はインストールを見つけることができません。using mpi ;
を含む user-config.jam でさまざまなバリアントを試しましたがusing mpi ;
、運がusing mpi : mpicl ;
ありませんでした。実際に何ができるかはわかりませんがusing mpi : c:/path/to/mpi/mpicl.bat
、 も使用してみました)。using mpi : <find-shared-library>impi ;
<find-shared-library>
私が得る使用using mpi ;
:
私が得る使用using mpi : mpicc
:
using mpi : <find-shared-library>impi ;
結果は
Boost.MPI を Intel MPI (Windows、Visual Studio 2010、x64) とリンクするにはどうすればよいですか?
cmake - cmake: ソフトウェアを boost::mpi にリンクする (mpich2 を使用)
この単純なコードの場合 (boost-mpi ドキュメントから取得):
そして、そのような CMakeLists.txt の場合:
boost_mpi が見つかりません:
しかし!次のパッケージをインストールしました:
見つからないのはなぜですか?人々がFIND_PACKAGE(Boost 1.4 COMPONENTS mpi REQUIRED)を使用するインターネット上の例はたくさんあります。
multithreading - MPI ノンブロッキング メッセージの非対称スループットの原因は何ですか?
2 つのタスク間の通信に MPI ノンブロッキング メッセージを使用しています。通信パターンは次のとおりです。各タスクには、他のタスクからメッセージを受信するマスター スレッドがあります。計算を行い、他のタスクにメッセージを送信する 5 つほどの作業スレッドがあります。マスター スレッドはループし、着信メッセージをテストします。これが唯一のことです。
私の問題は、タスク 0 がタスク 1 から送信されたすべてのメッセージを即座に受信する一方で (送受信されるメッセージの数はほぼ一致します)、タスク 1 はタスク 0 によって送信されたメッセージの約 1/4 しか受信しないことです。何千もの未処理のメッセージ。
PAPI を使用して、タスク 1 が test と irecv でブロックされているように見えることを確認しました。命令スループットは、他のタスクの >0.2 とは対照的に、わずか 0.03 命令/サイクルであり、デバッガーでタスクを停止すると、ロックを取得しようとしていることが示されます。ただし、ブロックしている受信とテストは、「欠落」したメッセージに対するものではなく、別のクラスの非常にまれなメッセージに対するものです。
実際にコードを試してみないと何が原因なのかはわかりませんが、MPI のパフォーマンスにこのような非対称性があることは不可解です。受信についていけないのは、試行錯誤が原因ではなく、受信メッセージのテストにすべての時間を費やしているためです。
MPI_THREAD_MULTIPLE で OpenMPI 1.5.3 を使用しており、通信は sm 経由です (2 つのタスクは同じノード上にあります)。
これを追跡する方法についてのアイデアをいただければ幸いです。