並列プログラミング IMO には、並列処理の識別と並列処理の指定という 3 つの部分があります。識別=アルゴリズムを並行作業のチャンクに分割し、指定=実際のコーディング/デバッグを実行します。識別は、並列処理を指定するために使用するフレームワークとは無関係であり、フレームワークがそれほど役立つとは思いません。アプリ、ターゲット プラットフォーム、一般的な並列プログラミングのトレードオフ (ハードウェア レイテンシなど) を十分に理解し、最も重要な経験が必要です。ただし、指定することは議論できます。これが私が以下で答えようとしているものです:
私は(学校や職場で)多くのフレームワークを試しました。すべてが共有メモリであるマルチコアについて質問されたので、私が使用した 3 つの共有メモリ フレームワークに固執します。
Pthreads (実際にはフレームワークではありませんが、確実に適用可能です):
長所: -Pthreads は非常に一般的です。私にとって、pthreads は並列プログラミングの組み立てのようなものです。pthread では、任意のパラダイムをコーディングできます。-柔軟なので、必要に応じて高性能にすることができます。あなたを遅くする固有の制限はありません。独自のコンストラクトとプリミティブを記述して、可能な限り高速化できます。
短所: -作業キューの管理、タスクの分散など、すべての配管を自分で行う必要があります。-実際の構文は見苦しく、多くの場合、アプリには多くの余分なコードが含まれているため、コードを書きにくく、読みにくくなっています。
OpenMP:
長所: -コードはきれいに見え、配管とタスク分割はほとんど内部で行われます -セミフレキシブル。仕事のスケジューリングのためのいくつかの興味深いオプションを提供します
短所: -並列処理のような単純な for ループを意味します。(新しい Intel バージョンもタスクをサポートしていますが、タスクは Cilk と同じです)。-基礎となる構造は、パフォーマンスのために適切に作成されている場合とそうでない場合があります。GNU の実装は問題ありません。Intel の ICC の方がうまく機能しましたが、より高いパフォーマンスを得るには、自分で何かを書きたいと思います。
Cilk、インテル TBB、Apple GCD:
長所: -タスクレベルの並列処理に最適な基本アルゴリズムであることが証明されている -シリアル/並列タスクの適切な制御 -TBB には、私が使用したパイプライン並列処理フレームワークもあります (率直に言うと、最適ではありません) -大量の書き込みタスクが不要になりますタスクベースのシステム用のコードの数。
短所: -基礎となる構造のパフォーマンスを制御しにくい。Intel TBB の基盤となるデータ構造のパフォーマンスが非常に低いことは知っています。たとえば、ワーク キューが不良でした (2008 年に見たとき)。-コードは、彼らがあなたに使ってほしいキーワードやバズワードをすべて含んでいるため、時々ひどいものに見えます -彼らの「柔軟な」APIを理解するには、多くの参考文献を読む必要があります