この質問は、この変更を提案する論文へのリンクを提供しており、並列性の側面に関して提案された内容に大きな変更はありませんでした。はい、コンパイラは、ターゲットハードウェアがさまざまなアルゴリズムの実行を並列化するのに合理的であれば何でもできます。ただし、正しい答えを得て(予約によって)、不必要なオーバーヘッドを課すことはありません。
理解するのに重要な点がいくつかあります。
まず、C++ 17の並列処理は、ではなく、の一般的な並列プログラミング機構です。これは、多くのSTLアルゴリズムの並列バージョンを提供します。したがって、OpenCL、TBBなどのより強力なメカニズムを置き換えるものではありません。
第2に、アルゴリズムを並列化しようとするときに固有の制限があります。そのため、これらの2つのかっこ修飾を追加しました。たとえば、std::accumulate
のパラレルバージョンは、の入力範囲に適用される関数が可換性および連想性の場合にのみ、非並列バージョンと同じ結果を生成します。ここで最も明白な問題領域は浮動小数点値です。ここでは、数学演算は連想ではないため、結果が異なる場合があります。同様に、一部のアルゴリズムでは、並列化すると実際にはオーバーヘッドが大きくなります。ネットスピードアップが得られますが、より多くの作業が行われるため、これらのアルゴリズムの高速化は処理単位数では線形ではありません。 std::partial_sum
が例です。各出力値は前の値に依存するため、アルゴリズムを並列化するのは簡単ではありません。それを行う方法はありますが、非並列アルゴリズムよりもコンバイナ関数の適用回数が多くなります。一般に、この現実を反映するためにアルゴリズムの複雑さの要件が緩和されています。
この詳細な回答を書き留めてくれてありがとう。 "C++ 17の並列処理は、一般的な並列プログラミング機構ではありません"私が正しく理解しているなら、 "std :: call_kernal <512,512>(kernal1);" ? –
@HumamHelfawi - いいえ、あなたはそれを見ません。 ** **はSTLアルゴリズムの一部(ほとんど)に影響を与えます。リンク先の論文で説明されているように、アルゴリズムを並行して実行するように要求する追加の引数を使用して呼び出すことができます。 –
そのため、 'std :: accumulate'は並列オーバーロードを持たず、代わりに' std :: reduce'を取得します。同様に 'partial_sum' =>' {包含的、排他} _scan'です。 –