C++

C++17 Parallel STL

  • このエントリーをはてなブックマークに追加
  • Pocket

C++17 テクニック #4

tl;dr

C++17から並行並列の新しいSTLが追加される。

これにより、並列化をコンパイラに丸投げできるようになり、可搬性も上がる。

記憶によれば、algorithmヘッダとnumericヘッダとmemoryヘッダが対象。

基本的に既存の関数のオーバーロードとして追加される。

全く新しい関数が追加されるものもある(特にnumeric)。

How to use

例としてソートを挙げる。

これまで通りの使い方をすれば、当然今までどおりシーケンシャルに動作する。

seqを第一引数に指定すると、シーケンシャルに動作せよという明示的な指定になる。

 

perは並列実行を許可するという指定である。

並列実行される保証はない。

 

per_unseqは並列実行かベクトル化実行、またはその両方を許可するという指定である。

並列実行/ベクトル化実行される保証はない。

 

新しく入るnumericの関数

numericには新しい関数が比較的たくさん入る。

exclusive_scanとinclusive_scan

partial_sumの亜種。

inclusive_scanはpartial_sumと同じく終端要素が出力に含まれる。

exclusive_scanの出力に終端要素は含まれない。

分かる人向けに書くけど、[0, i) と [0, i] の違いである。

reduce

accumulateの亜種。

実行順序が非決定的なバージョン。

transform_exclusive_scanとtransform_inclusive_scan

transform + scanを同時に行う。

transform_reduce

同じく、transform + reduceを同時に行う。

 

オーバーロード対象の関数一覧

algorithmヘッダ

  • adjacent_find
  • all_of
  • any_of
  • copy
  • copy_if
  • copy_n
  • count
  • count_if
  • equal
  • fill
  • fill_n
  • find
  • find_end
  • find_first_of
  • find_if
  • find_if_not
  • for_each
  • for_each_n (new)
  • generate
  • generate_n
  • includes
  • inplace_merge
  • is_heap
  • is_heap_until
  • is_partitioned
  • is_sorted
  • is_sorted_until
  • lexicographical_compare
  • max_element
  • merge
  • min_element
  • minmax_element
  • mismatch
  • move
  • none_of
  • nth_element
  • partial_sort
  • partial_sort_copy
  • partition
  • partition_copy
  • remove
  • remove_copy
  • remove_copy_if
  • remove_if
  • replace
  • replace_copy
  • replace_copy_if
  • replace_if
  • reverse
  • reverse_copy
  • rotate
  • rotate_copy
  • search
  • search_n
  • set_difference
  • set_intersection
  • set_symmetric_difference
  • set_union
  • sort
  • stable_partition
  • stable_sort
  • swap_ranges
  • transform
  • unique
  • unique_copy

numericヘッダ

  • adjacent_difference
  • exclusive_scan (new)
  • inclusive_scan (new)
  • inner_product
  • reduce (new)
  • transform_exclusive_scan (new)
  • transform_inclusive_scan (new)
  • transform_reduce (new)

memoryヘッダ

  • uninitialized_copy
  • uninitialized_copy_n
  • uninitialized_fill
  • uninitialized_fill_n

 

Parallel STL を実装したコンパイラはどこ?

Intel C++ Compiler が実装してる。

https://software.intel.com/en-us/get-started-with-pstl

<pstl/algorithm>という非標準のヘッダをインクルードすると使える。

残念ながら他のコンパイラ(ライブラリ)がParallel STLを実装したという話は2018/4/12現在聞いていない。

 

Visual Studio 2017 version 15.7で完全に実装されたようです!

Announcing: MSVC Conforms to the C++ Standard

  • このエントリーをはてなブックマークに追加
  • Pocket

コメントを残す

*

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください