これは、アドリアーノの回答に対する拡張コメント (および拡張) と考えてください。
OpenMP は、マスターして使用するのが非常に簡単で、シリアル実行可能ファイルと並列実行可能ファイルの両方を 1 つの同じソース コードから生成できるという優れた機能を備えています。既存のシリアル コードをパラレル コードに変換する必要がある場合は、段階的な並列化パスを使用することもできます。ただし、OpenMP には一連の欠点があります。まず、大規模な x86 SMP マシンが現在利用可能ですが、スケーラビリティを大幅に制限する共有メモリ マシンのみを対象としています (たとえば、クラスター インストールで最大 2 TiB の共有 RAM を共有する 128 CPU コアを備えた QPI 結合 Xeon システムを使用しています。大規模な OpenMP ジョブ)。第 2 に、そのプログラミング モデルは単純すぎて、いくつかの高度な概念を実装できません。しかし、OpenMP を簡潔に保つため、これはモデルの欠点ではなく長所であると言えます。
MPIはデファクトです現在では標準のメッセージ パッシング API です。広くサポートされており、多種多様な並列アーキテクチャで実行されます。その分散メモリ モデルは、基盤となるハードウェアにほとんどまたはまったく制限を課さず (低レイテンシと高帯域幅のネットワーク インターコネクトを備えていることを除けば)、数十万の CPU コアに拡張できます。MPI プログラムは、ソース レベルではかなり移植性がありますが、アルゴリズム自体は移植可能なスケーラビリティを備えていない場合があります (たとえば、1 つの MPI プログラムが Blue Gene/P で非常に効率的に実行され、InfiniBand クラスターでは非常に遅くなる場合があります)。MPI には重大な欠点が 1 つあります。その SPMD (Single Program Multiple Data) モデルは、プログラマーに代わって多くの統合失調症の思考を必要とし、OpenMP よりも習得がはるかに困難です。シリアル アルゴリズムを MPI に移植することは、OpenMP の場合ほど簡単ではなく、高い並列効率を達成するために完全な書き直しが必要になる場合があります。また、段階的な並列化アプローチを採用して、シリアル実行可能ファイルと並列実行可能ファイルの両方を生成できるコードベースを簡単に維持することもできません。MPI には興味深い機能があります。別のノードで実行されるプログラムのさまざまな部分を完全に分離し、ネットワークへの抽象的なインターフェイスを提供するため、異種コンピューティングが可能になります。いくつかの MPI 実装 (Open MPI など) は異種サポートを提供します。これにより、異なる OS で実行されているノードだけでなく、異なる「ビット数」とエンディアンを持つ CPU も混在させることができます。また、段階的な並列化アプローチを採用して、シリアル実行可能ファイルと並列実行可能ファイルの両方を生成できるコードベースを簡単に維持することもできません。MPI には興味深い機能があります。別のノードで実行されるプログラムのさまざまな部分を完全に分離し、ネットワークへの抽象的なインターフェイスを提供するため、異種コンピューティングが可能になります。いくつかの MPI 実装 (Open MPI など) は異種サポートを提供します。これにより、異なる OS で実行されているノードだけでなく、異なる「ビット数」とエンディアンを持つ CPU も混在させることができます。また、段階的な並列化アプローチを採用して、シリアル実行可能ファイルと並列実行可能ファイルの両方を生成できるコードベースを簡単に維持することもできません。MPI には興味深い機能があります。別のノードで実行されるプログラムのさまざまな部分を完全に分離し、ネットワークへの抽象的なインターフェイスを提供するため、異種コンピューティングが可能になります。いくつかの MPI 実装 (Open MPI など) は異種サポートを提供します。これにより、異なる OS で実行されているノードだけでなく、異なる「ビット数」とエンディアンを持つ CPU も混在させることができます。MPI には興味深い機能があります。別のノードで実行されるプログラムのさまざまな部分を完全に分離し、ネットワークへの抽象的なインターフェイスを提供するため、異種コンピューティングが可能になります。いくつかの MPI 実装 (Open MPI など) は異種サポートを提供します。これにより、異なる OS で実行されているノードだけでなく、異なる「ビット数」とエンディアンを持つ CPU も混在させることができます。MPI には興味深い機能があります。別のノードで実行されるプログラムのさまざまな部分を完全に分離し、ネットワークへの抽象的なインターフェイスを提供するため、異種コンピューティングが可能になります。いくつかの MPI 実装 (Open MPI など) は異種サポートを提供します。これにより、異なる OS で実行されているノードだけでなく、異なる「ビット数」とエンディアンを持つ CPU も混在させることができます。
Intel TBB は、強化された OpenMP のようなものです。CUDA や OpenCL などの他の並列プログラミング パラダイムに近づける、カーネルに基づくより豊富なプログラミング モデルを提供します。適用性と拡張性の点で、C++ STL アルゴリズムから多くを引き出します。また、コンパイラに中立であると想定されており、原則としてインテル C++ コンパイラ、GNU g++、および MSVC で動作するはずです。ITBB はまた、イデオロギーを「盗む」タスクを使用します。これは、予防策が講じられていない場合に以前のパラダイムで発生しがちだった計算上の不均衡を潜在的に均一化できる可能性があります。
Pthreads は、最新の Unix 系 (FreeBSD、Mac OS X、Linux など) の移植可能なスレッド化インターフェースです。これは単なるスレッド ライブラリであり、想像できる最も一般的な使用例を対象としています。並列構造はほとんどまたはまったく提供されず、その上にそれらを明示的にプログラムする必要があります。たとえば、OpenMP の単純なループ反復分散でさえ、手作業でコーディングする必要があります。Unix にとっての Pthreads は、Windows にとっての Win32 スレッドとまったく同じです。
(私はそのライブラリをよく知らないので、Microsoft TPP はスキップします)
単一ノードがますます多くのコアを獲得しているため、これらの概念を混合することは明らかに将来の道です。ほとんどのアルゴリズムで複数レベルの並列処理が可能であり、MPI を使用して粗粒度の並列処理 (複数のクラスター ノードで実行) を実行でき、OpenMP または ITBB を使用して個々のノード計算の細粒度分割を実行できます。共有メモリ プログラミングでは、メモリ リソースがすべてスレッド間で共有され、キャッシュの再利用などによって計算が大幅に高速化されるため、通常、メモリ リソースをより有効に活用できます。MPI はマルチコア SMP または NUMA マシンのプログラミングにも使用できますが、各 MPI プロセスは独自の仮想アドレス空間を持つ個別の OS プロセスであるため、多くの (構成) データを複製する必要がある場合があります。
プログラミングのバックグラウンドに最も近いものを選択することをお勧めします。あなたが熱心な C++ プログラマーであり、抽象化に慣れている場合は、Intel TBB (または .Net に興味がある場合は Microsoft PPL) を選択してください。OpenMP は習得が非常に簡単で、優れたパフォーマンスを提供しますが、どこか単純化されています。これは、Fortran でマルチスレッド コードを記述するための唯一の広く利用可能で使用されているメカニズムです。MPI の学習曲線は急ですが、プログラムが単一のコンピューティング ノードで提供できる範囲を超えた場合は、いつでも追加できます。