2

いくつかの常微分方程式を数値的に解きます。

私は(概念的に)非常に単純ですが、非常に長い計算をしています。非常に長い配列 (~2M セル) があり、セルごとに数値積分を実行する必要があります。この手順を 1000 回繰り返す必要があります。OpenMP 並列処理と 1 台の 24 コア マシンを使用すると、これを行うのに約 1 週間かかります (これは受け入れられません)。

私は 20 台のそのような (24 コア) マシンのクラスターを持っており、ハイブリッドの実装について考えています。MPI を使用してこれらの 20 個のノードを渡し、各ノードで通常の OpenMP 並列処理を使用したいと考えています。

基本的に、非常に長い配列を 20(ノード)X24(proccs) の作業単位に分割する必要があります。

より良い実装またはより良いアイデアの提案はありますか? 私はこのテーマについて多くのことを読んできましたが、そのようなハイブリッド実装が必ずしも実際の速度向上をもたらすとは限らないという印象を受けました。

「ワーカーのプール」を作成し、配列などでそれらを「フィード」する必要があるかもしれません。

どんな提案や有用なリンクも大歓迎です!

4

1 に答える 1

0

あなたの計算があなたが示したように恥ずかしいほど並列である場合、20 台のマシンすべてに負荷を分散することで、高速化が期待できます。good私が意味することはclose to 20close to 20あなたが実際に得た数字であり、努力が価値があるとあなたが考えていることを意味します.

提案されたハイブリッド ソリューションは確かに実現可能であり、実装すれば高速化が得られるはずです。

ハイブリッド MPI+OpenMP プログラムに代わる 1 つの方法は、ジョブ スクリプト (好みのスクリプト言語で記述) です。これは、大きな配列を単純に 20 個に分割し、プログラムのインスタンスを実行している各マシンで 1 つずつ、20 個のジョブを開始します。それらがすべて終了したら、結果を再結合する別のスクリプトを用意します。これにより、MPI コードをまったく作成する必要がなくなります。

コンピュータに Grid Engine がインストールされている場合は、おそらくジョブ送信スクリプトを記述して作業を配列ジョブとして送信し、Grid Engine に作業を個々のマシン/タスクに分割して処理させることができます。他のジョブ管理システムにも同様の機能があると思いますが、よく知りません。

もう 1 つの選択肢は、すべて MPI コードです。つまり、OpenMP を完全に削除し、実行時に使用可能なプロセッサを使用するようにコードを変更します。繰り返しになりますが、プログラムがプロセス間通信をほとんどまたはまったく必要としない場合は、速度が向上するはずです。

共有メモリ コンピューターで MPI を使用することは、OpenMP よりも (パフォーマンスの点で) 優れている場合もあれば、劣っている場合もあります。問題は、RAM、キャッシュ、インターコネクト、バス、およびその他すべての変数を考慮する必要がある特定のアーキテクチャ上の特定のプログラムにとって、どのアプローチが優れているかを特定するのが難しいことです。

主に考慮すべきデータを提供しなかったために、私が無視した要因の 1 つは、プログラムの負荷分散です。非常に大きなデータセットを 20 個の等しいサイズの断片に分割すると、20 個の等しい期間のジョブになりますか? そうでない場合、および入力によってジョブ時間がどのように変化するかを知っている場合は、ジョブを 20 等分するだけでなく、より洗練された方法で分割することもできます。たとえば、それを2000等分に切り刻み、一度に1つずつ機械に提供して実行することができます. この場合、負荷分散で得られるものは、ジョブ管理の時間コストによって失われる危険性があります。あなたは彼にお金を払い、あなたはあなたの選択をします。

あなたの問題の声明から、私はどのアプローチがパフォーマンスに関して同じ大まかな範囲に入ることを期待しているので、期待されるパフォーマンスに基づいてどのソリューションを選択するかについて決定を下すことはありませんが、開発する時間に実用的なソリューション。

于 2013-02-28T13:48:17.980 に答える