4

私の標準では、いくつかの非常に大規模な計算を実行するコードを開発しています。シングル CPU の見積もりに基づくと、予想実行時間は ~10 CPU 年、メモリ要件は ~64 GB です。IO はほとんどまたはまったく必要ありません。問題のコードのシリアル バージョン (C で記述) は十分に機能しており、コードを最適に並列化する方法について考え始める必要があります。

ノードあたり最大 64 GB の RAM と 16 コアのクラスターにアクセスできます。私はおそらく <= 8 ノードの使用に制限します。単一ノードのスレッド間でメモリが共有され、異なるノードで個別のメモリが使用され、ノード間の通信が比較的少ないセットアップを想像しています。

これまで読んだことから、私が思いついた解決策は、OpenMP を使用して個々の計算ノードでスレッドを管理し、OpenMPI を使用してノード間で情報を渡す、ハイブリッド OpenMP + OpenMPI 設計を使用することです: https:/ /www.rc.colorado.edu/crcdocs/openmpi-openmp

私の質問は、これがこの並列化を実装するための「最良の」方法であるかどうかです。私は経験豊富な C プログラマーですが、並列プログラミングの経験は非常に限られています (OpenMP の経験は少しあり、OpenMPI の経験はありません。過去の私の仕事のほとんどは恥ずかしいほど並列でした)。別の提案として、OpenMPI を使用して単一のホストでメモリを効率的に共有することは可能ですか? もしそうなら、OpenMP の使用を避けることができます。これにより、物事が少し単純になります (2 つではなく 1 つの API)。

4

1 に答える 1

7

ハイブリッドOpenMPおよびMPIコーディングは、2つの別々のレベルの並列処理を明確に識別できる問題に最も適しています。きめ細かい並列処理は、メッセージパッシングを使用して実装すると多くの通信を必要とするため、通信のオーバーヘッドが実行中の作業量に匹敵する可能性があるため、拡張性はありません。OpenMPは共有メモリのパラダイムであるため、データ通信は不要で、アクセスの同期のみが必要であり、よりきめ細かい並列タスクに適しています。OpenMPは、スレッド間のデータ共有(および共有された最終レベルのキャッシュを備えた最新のマルチコアCPUでの対応するキャッシュ共有)の恩恵も受けており、通常、同等のメッセージパッシングコードよりも必要なメモリが少なくて済みます。一部のデータをすべてのプロセスで複製する必要がある場合があります。反対側のMPIはクロスノードで実行でき、単一の共有メモリシステムでの実行に限定されません。

あなたの言葉は、あなたの並列化が非常に粗い、またはいわゆる驚異的並列問題に属していることを示唆しています。もし私があなたなら、私はハイブリッドに行きます。OpenMPプラグマのみを使用し、ランタイム呼び出しを使用しない場合(たとえばomp_get_thread_num())、OpenMPを有効にするかどうかに応じて、コードを純粋なMPI(つまり、スレッド化されていないMPIプロセスを使用)またはハイブリッドの両方としてコンパイルできます(コードをシリアルとしてコンパイルできるようにするためのダミーのOpenMPランタイムを提供します)。これにより、OpenMP(データ共有、キャッシュの再利用)とMPI(透過的なネットワーク、スケーラビリティ、簡単なジョブの起動)の両方の利点が得られ、OpenMPをオフにしてMPIのみのモードで実行するオプションが追加されます。また、追加のボーナスとして、相互接続された多コアCPUを私たちにもたらしているように見える未来に対応できるようになります。

于 2012-09-10T16:34:43.967 に答える