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>
も試しましたが、同じ結果が得られます。この新しい機能を使用するにはどうすればよいですか?
c ++ 17 はまだ確定していません。また、さまざまなコンパイラがまだ完全に実装していません。
-std=c++17
は、「完全に有効なC++ 17コンパイラであること」ではなく、「終了したC++ 17をすべてください」という意味です。
この機能は、現時点ではコンパイラーや標準ライブラリーではサポートされていません。数週間/月/年後にもう一度確認してください。
「C++ 17を完全にサポートしている場合はC++ 17を提供し、それ以外の場合はエラーを表示してください」というフラグはコンパイラに渡すことができません。部分的に実用的ではないからです。それらが提供するC++ 17のサブセットが十分であれば、あなたは勝ちます。また、完全に準拠したコンパイラが必要な場合、特定のバージョンのコンパイラにはバグがあるかどうかがわからないため、フラグをどうしても信頼できず、コンパイラバージョンに対してテストする必要があります。また、コンパイラのどのバージョンが十分に有効なC++ 17を持っているかを既に知っている場合、通知するためのフラグは必要ありません。
cppreference から理解する限り、この機能はドキュメントで定義されています P0024R2 で、どのコンパイラでもまだサポートされていません。
Microsoftコンパイラーの場合: C++ 17 Progress in VS 2017 15.5 and 15.6 を参照してください:
Status Std Paper Title
Partial C++17 P0024R2 Parallel Algorithms
GCCについては、 Fanael が comment に書いたように、表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
G ++を使用している場合は、非標準の拡張機能を試すことができます。
https://gcc.gnu.org/onlinedocs/libstdc++/manual/parallel_mode.html