9

はアルゴリズムのインデックスベースの並列がないため、それをエミュレートするために と組み合わせて使用​​できるかどうか疑問に思っています。あれは:ranges::view::iotastd::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) — そうではなく、ImodelsDecrementableの場合iterator_categoryは ですbidirectional_iterator_tag

(1.3) — それ以外の場合、ImodelsIncrementableの場合iterator_categoryは ですforward_iterator_tag

(1.4) — それ以外の場合iterator_categoryは ですinput_iterator_tag

上記のコードは正しいですか?iota_viewこの方法を使用すると、パフォーマンスが低下することはありますか?


編集: range-v3cmcstl2、および 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 )。

4

3 に答える 3