4

私は2つの基本的な違いを理解しています。プログラムでstd :: asyncを使用して並行処理を行うことがよくあります。並行処理と並列処理 - 具体的にはC++で

C++で並列処理を提供できる信頼できるライブラリがありますか? (私はこれがC++ 17の可能性のある機能であることを知っています)。もしそうなら、彼らのあなたの経験は何ですか?

ありがとうございます! バーブラブ

+0

''ライブラリには多くのパラレルバージョンがありますが、それらが意味のある利点を提供するかどうかは、実装の選択によって異なります。 –

+0

@KerrekSBコンパイラが実際にアルゴリズムのパラレルバージョンを実装しましたか? –

答えて

5

スレッディングビルディングブロック(TBB)は、タスク並列処理用のテンプレートC++ライブラリです。ライブラリには、タスクの並列処理に特化したさまざまなアルゴリズムとデータ構造が含まれています。私はparallel_forとparallel_pipelineを使って成功を収め、計算を大幅に高速化しました。ちょっとしたコードを追加するだけで、TBBのparallel_forは、並列実行されるのに適したシリアルforループを作成し、そのように実行することができます(例hereを参照)。 TBBのparallel_pipelineには、従属タスクのチェーンを実行する機能があり、それぞれのオプションが並列またはシリアルで実行されます(例:here参照)。ウェブ上でもっと多くの例が特にあります。software.intel.com、ここではstackoverflow()です。

OpenMPは、主にコンパイラ指令によってアクセスされるスレッド並列処理用のAPIです。しかし、私はTBBが提供するより豊富な機能セットを使用することを好みますが、OpenMPは並列アルゴリズムとコードをテストする簡単な方法です(プラグマを追加していくつかのビルド設定を行うだけです)。いったんテストして実験したら、OpenMPの特定の用途をTBBに変換することはかなり簡単にできることが分かりました。これは、OpenMPが深刻なコーディングのためのものではないと言っているわけではありません。実際には、OpenBTBよりもOpenMPを優先するケースがあります(1つはプラグマに依存しているため、シリアル実行への切り替えはTBBより簡単です)。 OpenMPを利用した多くのオープンソースプロジェクトは、discussionにあります。いくつかの例があります(例:on wikipedia)。OpenMPのWeb上でのチュートリアルもあります。ここには、stackoverflowに関する多くの質問があります。

以前は、データの並列性を提供するSIMD(単一命令、複数データ)についての議論を無視しました。以下のコメントで指摘されているように、OpenMPはSIMDを探索するオプションです(これはlinkにチェックしてください)。 SSEおよびAVX(x86命令セットアーキテクチャの拡張)およびNEON(ARMアーキテクチャ)などの命令セットの拡張も検討する価値があります。私はSSEとAVXを使って、良い経験と悪い経験をしています。良いことは、彼らが特定のアルゴリズム(特に私はIntel intrinsicsを使用している)まで素敵なスピードを提供できるということです。悪い点は、これらの命令を使用する能力が特定のCPUサポートに依存しているため、予期しない実行時例外が発生する可能性があるということです。

特に、並列性と数学に関しては、Intel MKL(現在はno cost option)とOpenBLASを使用して良い経験をしています。これらのライブラリは、一般的な数学的関数/ルーチン(例えば、BLASおよびLAPACK)の最適化された、並列の、および/またはベクトル化された実装を提供する。ある程度最適化された並列性を必要とする数学を特別に扱う多くのライブラリがあります。彼らは、並列性のより低いレベルの構築ブロック(例えば、スレッドを操作する能力、タスクをスケジュールする能力)を提供しないかもしれないが、計算数学の分野における莫大な研究および作業を利用する(そして貢献する)ことは非常に価値がある。同様の陳述は、数学の外の関心領域について言えるかもしれません。

+1

OpenMPは、並列アルゴリズムをテストするためのものではありません。また、TBBはタスク並列性に基づいており、OpenMPはスレッド並列性に基づいていることも指摘しておくことが重要です(SIMD機能もありますが、主にスレッド並列化に使用されています)。 –

+0

@ Zboson、私はOpenMPのより中立な立場を反映するために私の答えを更新し、あなたのコメントを取り入れました。私はTBBを脇に置いていますが、OpenMPは非常に貴重なツールです。 OpenCVとインテルMKLの一部として間接的に使用しています。私はOpenMPのSIMD機能を知らなかった。データの並列処理に関連するので、SIMDの簡単な段落を追加しました。 –