web-dev-qa-db-ja.com

新しいC ++ 17実行ポリシーを使用するにはどうすればよいですか?

std :: algorithm のドキュメントを読んでいた cppreference.com で、まだ使っていないクールなものの多くにC++ 17タグがあることに気付いた。最も注目されたのは、 新しい実行ポリシー それらについて読んだことから収集したのは、実行ポリシーを指定するだけで、マルチスレッド化したいfor_eachループを作成できるということです。

たとえば、2Dグラフィックを含む画像を出力するプログラムがあります。

int main(){
    std::for_each(
        img.buffer().begin(),
        img.buffer().end(),
        renderer(
            {-0.5, 0.0, 2.666, 2.0, M_PI / 2.0, 0.0},
            img,
            16
        )
    );
    fout << img;
}

このプログラムをマルチスレッドにしたい場合は、1行で実行できるはずです。

int main(){
    std::for_each(
        std::execution::par_unseq, // c++17 feature
        img.buffer().begin(),
        img.buffer().end(),
        renderer(
            {-0.5, 0.0, 2.666, 2.0, M_PI / 2.0, 0.0},
            img,
            16
        )
    );
    fout << img;
}

ただし、(g++ -std=c++17で)これを最初に試したときに、‘std::execution’ has not been declaredであるというエラーが表示されたため、#include <execution>を追加しようとしましたが、execution: No such file or directoryと表示されます。 #include<experimental/algorithm>の代わりに#include<algorithm>も試しましたが、同じ結果が得られます。この新しい機能を使用するにはどうすればよいですか?

16
Willy Goat

c ++ 17 はまだ確定していません。また、さまざまなコンパイラがまだ完全に実装していません。

-std=c++17は、「完全に有効なC++ 17コンパイラであること」ではなく、「終了したC++ 17をすべてください」という意味です。

この機能は、現時点ではコンパイラーや標準ライブラリーではサポートされていません。数週間/月/年後にもう一度確認してください。

「C++ 17を完全にサポートしている場合はC++ 17を提供し、それ以外の場合はエラーを表示してください」というフラグはコンパイラに渡すことができません。部分的に実用的ではないからです。それらが提供するC++ 17のサブセットが十分であれば、あなたは勝ちます。また、完全に準拠したコンパイラが必要な場合、特定のバージョンのコンパイラにはバグがあるかどうかがわからないため、フラグをどうしても信頼できず、コンパイラバージョンに対してテストする必要があります。また、コンパイラのどのバージョンが十分に有効なC++ 17を持っているかを既に知っている場合、通知するためのフラグは必要ありません。

cppreference から理解する限り、この機能はドキュメントで定義されています P0024R2 で、どのコンパイラでもまだサポートされていません。

1

Microsoftコンパイラーの場合: C++ 17 Progress in VS 2017 15.5 and 15.6 を参照してください:

Status  Std   Paper   Title
Partial C++17 P0024R2 Parallel Algorithms

GCCについては、 Fanaelcomment に書いたように、表1.5を参照してください。 C++ 2017実装ステータスat https://gcc.gnu.org/onlinedocs/libstdc++/manual/status.html#status.iso.2017

Library Feature                             Proposal    Status
The Parallelism TS Should be Standardized   P0024R2     No
0

G ++を使用している場合は、非標準の拡張機能を試すことができます。

https://gcc.gnu.org/onlinedocs/libstdc++/manual/parallel_mode.html

0
sashang