c++17にはアルゴリズムのインデックスベースの並列がないため、それをエミュレートするために と組み合わせて使用できるかどうか疑問に思っています。あれは:ranges::view::iota
std::for_each
using namespace std;
constexpr int N= 10'000'000;
ranges::iota_view indices(0,N);
vector<int> v(N);
for_each(execution::par_unseq,indices.begin(),indices.end(),[&](int i) { v[i]= i; });
iota_view
適切なタイプ( [range.iota.iterator] )のランダムアクセスを提供しているようです:
iota_view<I, Bound>::iterator::iterator_category
は次のように定義されます。(1.1) —
I
モデルAdvanceable
の場合、iterator_category
は ですrandom_access_iterator_tag
。(1.2) — そうではなく、
I
modelsDecrementable
の場合iterator_category
は ですbidirectional_iterator_tag
。(1.3) — それ以外の場合、
I
modelsIncrementable
の場合iterator_category
は ですforward_iterator_tag
。(1.4) — それ以外の場合
iterator_category
は ですinput_iterator_tag
。
上記のコードは正しいですか?iota_view
この方法を使用すると、パフォーマンスが低下することはありますか?
編集: range-v3、cmcstl2、および Intel のPSTLでいくつかのテストを行いました。
range-v3 を使用すると、上記の例は GCC 8 でのコンパイルに失敗しbegin
ますend
。
deduced conflicting types for parameter ‘_ForwardIterator’ (‘ranges::v3::basic_iterator<ranges::v3::iota_view<int, int> >’ and ‘ranges::v3::default_sentinel’)
cmcstl2 を使用すると、コードはきれいにコンパイルされますが、並列には実行されません。おそらくフォワードイテレータの要件が何らかの形で満たされていないため、順次バージョンにフォールバックしているように思えます( https://godbolt.org/z/yvr-M2 )。
多少関連する PSTL の問題があります ( https://github.com/intel/parallelstl/issues/22 )。