2011-07-25 7 views
2

分散コンピューティングシステムの実装に役立つフレームワーク/ライブラリがあるかどうかを調べています。分散コンピューティングのためのC/C++フレームワーク(MPI?)

大量のデータを数百メガバイトのファイルに分割したマスターがあります。ファイルは〜1MBの断片にチャンクされ、処理のために作業者に配布されます。一度初期化されると、各作業者の処理は前のチャンクから取得した状態情報に依存するため、作業者はプロセス全体を通じて生き続ける必要があり、マスタは適切なチャンクを適切な作業者に送信できる必要があります。注意すべき点の1つは、このシステムがより大きな処理チェーンの一部に過ぎないことです。

私はMPI(特にOpen MPI)を調べましたが、それが適切かどうかはわかりません。小さなメッセージ(数バイト)を送信するようになっているようですが、大きなファイル(最大1/5 MB)でスループットが増加することを示すグラフがいくつか見つかりました。

私は、常にメッセージで前後に送られない限り、状態を維持する方法がないかもしれないと心配しています。いくつかのMPIの例の構造を見ると、それはマスター(ランク0)のように見え、ワーカー(ランク1-n)は同じ部分の一部であり、その行動は条件によって決定された。労働者が生きていて(状態を維持して)、もっと多くのメッセージが届くのを待つことができますか?

私はこれを書いているので、これはうまくいくと思っています。ランク1 ... nセクションは、ブロッキング受信とそれに続く処理コードのループにすぎません。状態は、「それ以上のデータ」メッセージが受信されて結果を返信するまで、そのループ内で維持される。私はここでMPIの構造を把握し始めているかもしれません...

私の他の質問は、実際にコードを実行する方法です。このシステムは大規模なシステムの一部であるため、他のコードから呼び出す必要があります。私が見た例では、mpirunを使用しています。mpirunでは、プロセッサ数やホストファイルの指定方法を指定できます。他のコードから自分のMPI関数を呼び出すことで、同じ動作をさせることはできますか?

私の質問はMPIの正しいフレームワークですか?このタスクに適したものがありますか?これを最初からやっていますか?

+0

あなたは、CまたはC++でいますか? – Puppy

答えて

2

MPIはあなたの仕事にとって妥当な選択肢です。 SPMDアーキテクチャを使用しています。つまり、おそらく分散型システムでも異機種システムでも同じプログラムを同時に実行できます。したがって、ランク0がマスターであり、他の人がワーカーであるプロセスの選択は必須ではなく、他のパターンを選択することができます。

アプリケーションの状態を提供したい場合は、常時稼動するMPIアプリケーションとマスタープロセスを使用して、時間の経過とともに作業者にコマンドを送信することができます。おそらく、障害に対してより頑強にするために、その状態をディスクに保存することも考慮する必要があります。

MPIプロセスの実行は、最初にmpirunによって実行されます。たとえば、プログラムprogram.cを作成し、mpicc -o program program.cを使用してコンパイルします。次に、mpirun -np 20 ./program <params>を実行して20のプロセスを実行する必要があります。 20の独立したプロセスがそれぞれ独自のランクを持ちますので、さらに進歩があなたのアプリケーションにあります。これらの20のプロセスがノード/プロセッサ間で分散される方法は、hostfileなどのようなものによって制御されます。ドキュメントをより詳しく見てください。

あなたのコードを他のMPIプログラムから再利用可能にするには、少なくともMPI Communicatorが何であるか、そしてどのように作成/使用するかを学ぶ必要があります。ネット上には「MPIライブラリの作成」というキーワードがあります。

あなたのライブラリを使用しているコードがMPI自体に存在しない場合、それは大きな問題ではなく、MPIのプログラムは通信中のMPIに限定されません。それはMPIを介してロジック内で通信するだけです。 mpirunを使用して任意のプログラムを呼び出すことはできますが、MPIライブラリへの呼び出しが試みられない限り、MPIで実行されていることに気付かないでしょう。

0

FastFlowをご覧ください。データフローモデルを使用してデータを処理します。このモデルがあなたに適しているなら、非常に効率的です。

2

クラスタとmpiで起動している場合は、ブーストmpiを参照することをお勧めします。基礎となるmpiライブラリ(openmpiやmpich2など)上のC++ラッパーです。私はそれが非常に便利だとわかった。

メッセージを前後に送信するというアイデアがあります。各ノードは、メッセージが終了したときに新しいメッセージを要求し、「それ以上のメッセージはありません」というメッセージが表示されるまでお待ちください。私も同様のアイディアを持ち、シンプルなバージョンを稼働させました。私はちょうどあなたが一見を持ってほしい場合に備えて、あなたのためにギターにそれを置く。 https://github.com/thshorrock/mpi_manager。ほとんどのコードはヘッダーファイルにあります: https://github.com/thshorrock/mpi_manager/blob/master/include/mpi_manager/mpi_manager.hpp これは私を起動させるために使用したコードであり、完全に文書化されていません。最終バージョンではありませんが、私の目的のために正常に動作し、あなたの出発点を提供する必要があります。

-1

RayPlatformはC++のMPIフレームワークです。アプリケーションのプラグイン(Linuxのモジュールなど)を定義する必要があります。

RayPlatformはLGPLv3でライセンスされています。 リンク:https://github.com/sebhtml/RayPlatform

これもよく記載されています。

RayPlatformを使用してアプリケーション例:https://github.com/sebhtml/RayPlatform-example

編集:追加リンク

関連する問題