std::experimental::parallel:: reduce
|
헤더에 정의됨
<experimental/numeric>
|
||
|
template
<
class
InputIt
>
typename
std::
iterator_traits
<
InputIt
>
::
value_type
reduce
(
|
(1) | (parallelism TS) |
|
template
<
class
ExecutionPolicy,
class
InputIterator
>
typename
std::
iterator_traits
<
InputIt
>
::
value_type
reduce
(
|
(2) | (parallelism TS) |
|
template
<
class
InputIt,
class
T
>
T reduce ( InputIt first, InputIt last, T init ) ; |
(3) | (parallelism TS) |
|
template
<
class
ExecutionPolicy,
class
InputIt,
class
T
>
T reduce ( ExecutionPolicy && policy, InputIt first, InputIt last, T init ) ; |
(4) | (parallelism TS) |
|
template
<
class
InputIt,
class
T,
class
BinaryOp
>
T reduce ( InputIt first, InputIt last, T init, BinaryOp binary_op ) ; |
(5) | (parallelism TS) |
|
template
<
class
ExecutionPolicy,
class
InputIt,
class
T,
class
BinaryOp
>
T reduce
(
ExecutionPolicy
&&
policy,
|
(6) | (parallelism TS) |
[
first
,
last
)
를 축소하며, 지정되지 않은 방식으로 순열 및 집계될 수 있고, 초기값
init
과 함께
binary_op
에 대해 수행됩니다.
binary_op 이 결합 법칙이나 교환 법칙을 따르지 않는 경우, 동작은 비결정적입니다.
binary_op
가 어떤 요소를 수정하거나
[
first
,
last
)
범위 내의 어떤 반복자를 무효화하는 경우, 그 동작은 정의되지 않습니다.
목차매개변수
반환값init 와 * first , * ( first + 1 ) , ... * ( last - 1 ) 에 대한 일반화된 합을 binary_op 로 계산합니다, 일반화된 합 GSUM(op, a 1 , ..., a N ) 은 다음과 같이 정의됩니다:
다시 말해, 범위의 요소들은 임의의 순서로 그룹화되고 재배열될 수 있습니다. 복잡도O(last - first) 번의 binary_op 적용. 예외
참고 사항범위가 비어 있으면, init 가 수정되지 않은 상태로 반환됩니다.
예제reduce는 std::accumulate 의 비순차 실행 버전입니다:
이 코드 실행
#include <chrono> #include <experimental/execution_policy> #include <experimental/numeric> #include <iostream> #include <numeric> #include <vector> int main() { std::vector<double> v(10'000'007, 0.5); { auto t1 = std::chrono::high_resolution_clock::now(); double result = std::accumulate(v.begin(), v.end(), 0.0); auto t2 = std::chrono::high_resolution_clock::now(); std::chrono::duration<double, std::milli> ms = t2 - t1; std::cout << std::fixed << "std::accumulate result " << result << " took " << ms.count() << " ms\n"; } { auto t1 = std::chrono::high_resolution_clock::now(); double result = std::experimental::parallel::reduce( std::experimental::parallel::par, v.begin(), v.end()); auto t2 = std::chrono::high_resolution_clock::now(); std::chrono::duration<double, std::milli> ms = t2 - t1; std::cout << "parallel::reduce result " << result << " took " << ms.count() << " ms\n"; } } 가능한 출력: std::accumulate result 5000003.50000 took 12.7365 ms parallel::reduce result 5000003.50000 took 5.06423 ms 같이 보기
| |||||||||||||||||||||||||