9

多くの計算を行い、多くのメモリを使用する科学的なアプリケーションをC++で作成する必要があります。私には仕事の一部がありますが、リソースの面で高い要件があるため、OpenMPIへの移行を開始しようと考えていました。

その前に、私は単純な好奇心を持っています。OpenMPIの原則を正しく理解していれば、その時点で利用可能なノードに基づいてSENDとRECEIVEを呼び出すさまざまなノードにジョブを分割するタスクを持っているのは開発者です。

ライブラリやOS、またはこの機能を備えたものが存在するかどうかを知っていますか?これにより、コードを現在の状態のままにすることができます。基本的に、すべてのコンピューターを接続し、それらのメモリーとCPUを1つとして共有できるものですか?

このトピックに関する膨大な量の資料があるため、私は少し混乱しています。クラウドコンピューティングを見るべきですか?または分散共有メモリ?

4

4 に答える 4

5

現在、マシンのクラスター間でコードを自動的に並列化できるC++ライブラリまたはユーティリティはありません。他のアプローチで分散コンピューティングを実現する方法はたくさんあるので、メッセージパッシングまたは分散共有メモリを使用するようにアプリケーションを最適化する必要があります。

あなたの最善の策は次のとおりです。

  1. 実装をタスクベースのソリューションに変換します。これを行う方法はたくさんありますが、これは間違いなく手作業で行われます。
  2. タスクを分割できる場所と、これらのタスクが基本的に相互に通信する方法を明確に特定します。
  3. OpenMPI/Mpichに基づいて構築されたより高いレベルのライブラリを使用します-Boost.MPIが思い浮かびます。

並列分散ソリューションを実装することは1つのことですが、それを効率的に機能させることは別のことです。さまざまなトポロジとさまざまな並列コンピューティングパターンを読んで、ソリューションの実装を最初からやり直す場合よりも少し苦痛を軽減します。

于 2010-03-31T09:58:04.437 に答える
4

さて、あなたは実際にあなたがターゲットにしているハードウェアが何であるかを正確に述べていません、それが共有メモリマシンであるなら、OpenMPはオプションです。ほとんどの並列プログラマーは、OpenMPを使用した並列化を、その化身のいずれかでMPIを使用するよりも簡単なオプションと見なします。また、MPIよりもOpenMPを既存のコードに後付けする方が簡単であることをお勧めします。最高のパフォーマンスを発揮するという意味での最高のMPIプログラムは、メッセージパッシングと並列化するためにゼロから設計されたプログラムです。

さらに、並列化された後は、最良の順次アルゴリズムが常に最も効率的なアルゴリズムであるとは限りません。単純であるが、順次準最適なアルゴリズムがより良い選択である場合があります。

共有メモリコンピュータにアクセスできる場合があります。

  • すべてのマルチコアCPUは、事実上共有メモリコンピューターです。
  • 多くのクラスターでは、ノードは多くの場合2つまたは4つのCPUに対応しており、それぞれに4つのコアがある場合は、クラスター上に16コアの共有メモリマシンがある可能性があります。
  • MPPスーパーコンピューターにアクセスできる場合は、その各ノードが共有メモリコンピューターであることがわかるでしょう。

メッセージパッシングに固執している場合は、C ++とOpenMPI(またはシステムにすでにインストールされているMPI)を使用することを強くお勧めします。BoostMPIも確認する必要があります。高性能の科学計算の主流の外に出ると、研究にぴったりのライブラリやその他のツールの特異なコレクションを備えた1つのプログラミングの軍隊にいることに気付くかもしれないので、これを強くお勧めします。C ++、OpenMPI、Boostは十分に使用されているため、「兵器級」または好みのアナロジーであると見なすことができます。SOには十分なトラフィックがありません。たとえば、MPIやOpenMPでは、ファームに賭ける前に、他のテクノロジーの統計を確認してください。

MPIの経験がない場合は、KarniadakisとKirbyによる C++およびMPIのParallelScientificComputingという本を参照してください。Gropp et alによるMPIの使用は参考としては問題ありませんが、メッセージパッシングのプログラミングに関する初心者向けのテキストではありません。

于 2010-04-01T10:02:57.680 に答える
2

メッセージパッシングがあなたを抑えている場合は、分散オブジェクトを試してください。利用可能な分散オブジェクトフレームワークはたくさんあります。いくつか例を挙げると、CORBA、DCOM、ICE ...オブジェクトを配布することを選択した場合、オブジェクトは、定義するインターフェイス(データとメソッドの両方)を通じてグローバルに可視化されます。任意のノードの任意のオブジェクトがこれらの分散オブジェクトにアクセスできます。

私はメモリを分散できるソフトウェアを探していましたが、何も見つかりませんでした。これらの分散オブジェクトフレームワークがすべて利用可能であり、人々がそのようにメモリを分散する必要がないためだと思います。

于 2010-03-30T21:15:37.970 に答える
2

大学院でTop-Cを使って良い経験をしました。

ホームページから:「TOP-Cは、既存のシーケンシャルアプリケーションを簡単に並列化するためのパッケージとして特に際立っています。」

http://www.ccs.neu.edu/home/gene/topc.html

編集:追加する必要があります。「自明な並列処理」を使用する場合、プログラムを並列化する方がはるかに簡単です。たとえば、ノードはメモリを共有する必要はありません。Mapreduceは、この概念に基づいて構築されています。ノードが使用する共有状態の量を最小限に抑えることができれば、並列処理による桁違いの改善が見られます。

于 2010-03-31T14:27:37.630 に答える