あなたの計算があなたが示したように恥ずかしいほど並列である場合、20 台のマシンすべてに負荷を分散することで、高速化が期待できます。good
私が意味することはclose to 20
、close 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つずつ機械に提供して実行することができます. この場合、負荷分散で得られるものは、ジョブ管理の時間コストによって失われる危険性があります。あなたは彼にお金を払い、あなたはあなたの選択をします。
あなたの問題の声明から、私はどのアプローチがパフォーマンスに関して同じ大まかな範囲に入ることを期待しているので、期待されるパフォーマンスに基づいてどのソリューションを選択するかについて決定を下すことはありませんが、開発する時間に実用的なソリューション。