現在、最適化問題を解決するための C++ のシリアル ソルバーがあり、ソルバーのパフォーマンスを改善できるかどうかを確認するために、さまざまなパラメーターを使用してソルバーを並列化することになっています。現在、TBB と MPI のどちらを使用すべきかわかりません。私が読んだ TBB の本から、TBB はループまたはきめ細かいコードに適していると感じています。私はTBBの経験があまりないので、並列化を実現するためにコードを細かく分割するのは難しいと感じています。さらに、文献から、多くの著者が MPI を使用して複数のソルバーを並列化し、それらを連携させていることがわかりました。おそらくMPIの方が私のニーズに合っていると思います。私はTBBまたはMPIのどちらについてもあまり知識がありません。私の気持ちが正しいかどうか誰でも教えてくれますか? MPI は私により適していますか? もしそうなら、MPI の学習を開始するのに適した資料は何ですか。私は MPI の経験がなく、Windows システムと C++ を使用しています。どうもありがとう。
1 に答える
心に留めておく必要がある基本的なことは、共有メモリと分散メモリのどちらかを選択することです。共有メモリとは、共通メモリにアクセスできる複数のプロセス (通常はプロセス内に複数のスレッド) がある場合です。これは非常にきめが細かい場合があり、通常はシングルスレッド プログラムを複数のスレッドに適合させる方が簡単です。ほとんどの場合、スレッドがメモリの別々の部分で動作し (データの並列処理を活用)、共有部分がロックを使用して同時アクセスから保護されるようにプログラムを設計する必要があります。分散メモリとは、1 つまたは複数の分散コンピューターで実行される可能性のあるさまざまなプロセスがあることを意味しますが、これらのプロセスは共通の目標を持ち、メッセージ パッシング (データ通信) を通じてデータを共有します。共通のメモリ空間はなく、あるプロセスが別のプロセスから必要とするすべてのデータは通信を必要とします。これはより一般的なアプローチですが、通信要件のため、大まかな粒度が必要です。TBB はスレッドベースの共有メモリ並列処理をサポートするライブラリであり、MPI は分散メモリ並列処理のライブラリです (通信用の単純なプリミティブと、異なるノード実行での複数のプロセスのスクリプトも含まれています)。
最も重要なことは、ソルバー内の並列性を特定し、最適なソリューションを選択することです。データの並列性はありますか (通信やデータの一部の共有を必要とせずに、異なるスレッド/プロセスがデータの異なるチャンクで並行して動作する可能性があります)? タスクの並列処理 (さまざまなスレッド/プロセスが、データに対してさまざまな変換を実行したり、パイプラインまたはグラフ形式でデータ処理のさまざまなステップを実行したりする可能性があります)?