std::experimental::parallel:: transform_reduce
|
헤더 파일에 정의됨
<experimental/numeric>
|
||
|
template
<
class
InputIt,
class
UnaryOp,
class
T,
class
BinaryOp
>
T transform_reduce
(
InputIt first, InputIt last,
|
(1) | (parallelism TS) |
|
template
<
class
ExecutionPolicy,
class
InputIt,
class
UnaryOp,
class
T,
class
BinaryOp
>
|
(2) | (parallelism TS) |
범위
[
first
,
last
)
내의 각 요소에
unary_op
을 적용하고, 그 결과들을 초기값
init
과 함께
binary_op
을 통해 (지정되지 않은 방식으로 순열 및 집계될 수 있는) 축소 연산을 수행합니다.
binary_op 이 결합 법칙이나 교환 법칙을 따르지 않는 경우, 해당 동작은 비결정적입니다.
unary_op
또는
binary_op
가
[
first
,
last
)
범위 내의 어떤 요소를 수정하거나 어떤 반복자를 무효화하는 경우, 그 동작은 정의되지 않습니다.
목차 |
매개변수
| first, last | - | 알고리즘을 적용할 요소들의 범위 |
| init | - | 일반화된 합의 초기값 |
| policy | - | 실행 정책 |
| unary_op | - | 입력 범위의 각 요소에 적용될 단항 FunctionObject . 반환 타입은 binary_op 의 입력으로 허용 가능해야 함 |
| binary_op | - | unary_op 의 결과, binary_op 의 다른 결과들, 그리고 init 에 지정되지 않은 순서로 적용될 이항 FunctionObject |
| 타입 요구사항 | ||
-
InputIt
는
LegacyInputIterator
요구사항을 충족해야 함
|
||
반환값
init 와 unary_op ( * first ) , unary_op ( * ( first + 1 ) ) , ... unary_op ( * ( last - 1 ) ) 의 일반화된 합을 binary_op 에 대해 계산하며, 여기서 일반화된 합 GSUM(op, a 1 , ..., a N ) 는 다음과 같이 정의됩니다:
- 만약 N = 1 , a 1 ,
- 만약 N > 1 , op(GSUM(op, b 1 , ..., b K ), GSUM(op, b M , ..., b N )) 이면
-
- b 1 , ..., b N 는 a1, ..., aN 의 임의의 순열일 수 있으며
- 1 < K + 1 = M ≤ N
다시 말해, unary_op 의 결과는 임의의 순서로 그룹화되고 배열될 수 있습니다.
복잡도
O(last - first) 번의 unary_op 와 binary_op 각각의 적용.
예외
- 알고리즘의 일부로 호출된 함수 실행에서 예외가 발생하면,
-
-
policy가parallel_vector_execution_policy인 경우, std::terminate 가 호출됩니다. -
policy가sequential_execution_policy또는parallel_execution_policy인 경우, 알고리즘은 모든 포착되지 않은 예외를 포함하는 exception_list 와 함께 종료됩니다. 포착되지 않은 예외가 하나만 있는 경우, 알고리즘은exception_list로 감싸지 않고 해당 예외를 다시 던질 수 있습니다. 첫 번째 예외가 발생한 후 반환되기 전에 알고리즘이 수행할 작업의 양은 명시되지 않습니다. -
policy가 다른 타입인 경우, 동작은 구현에 따라 정의됩니다.
-
-
알고리즘이 메모리 할당에 실패하는 경우(자체적으로 또는 사용자 예외를 처리할 때
exception_list를 구성하기 위해), std::bad_alloc 이 throw됩니다.
참고 사항
unary_op 는 init 에 적용되지 않습니다.
범위가 비어 있으면, init 가 수정되지 않은 상태로 반환됩니다.
-
policy가sequential_execution_policy의 인스턴스인 경우, 모든 작업은 호출 스레드에서 수행됩니다. -
policy가parallel_execution_policy의 인스턴스인 경우, 작업은 지정되지 않은 수의 스레드에서 서로 불확정적으로 순서화되어 수행될 수 있습니다. -
policy가parallel_vector_execution_policy의 인스턴스인 경우, 실행은 병렬화 및 벡터화될 수 있습니다: 함수 경계가 존중되지 않으며 사용자 코드가 임의의 방식으로 중첩되고 결합될 수 있습니다 (특히, 이는 사용자가 제공한 Callable이 공유 자원에 접근하기 위해 뮤텍스를 획득해서는 안 됨을 의미합니다).
예제
transform_reduce는 std::inner_product 를 병렬화하는 데 사용할 수 있습니다:
#include <boost/iterator/zip_iterator.hpp> #include <boost/tuple.hpp> #include <experimental/execution_policy> #include <experimental/numeric> #include <functional> #include <iostream> #include <iterator> #include <vector> int main() { std::vector<double> xvalues(10007, 1.0), yvalues(10007, 1.0); double result = std::experimental::parallel::transform_reduce( std::experimental::parallel::par, boost::iterators::make_zip_iterator( boost::make_tuple(std::begin(xvalues), std::begin(yvalues))), boost::iterators::make_zip_iterator( boost::make_tuple(std::end(xvalues), std::end(yvalues))), [](auto r) { return boost::get<0>(r) * boost::get<1>(r); } 0.0, std::plus<>() ); std::cout << result << '\n'; }
출력:
10007
참고 항목
|
요소 범위의 합계를 계산하거나 접습니다
(function template) |
|
|
요소 범위에 함수를 적용하여 결과를 대상 범위에 저장합니다
(function template) |
|
|
(parallelism TS)
|
std::accumulate
와 유사하지만 순서가 보장되지 않습니다
(function template) |