Namespaces
Variants

std::experimental::parallel:: transform_reduce

From cppreference.net
헤더 파일에 정의됨 <experimental/numeric>
template < class InputIt, class UnaryOp, class T, class BinaryOp >

T transform_reduce ( InputIt first, InputIt last,

UnaryOp unary_op, T init, BinaryOp binary_op ) ;
(1) (parallelism TS)
template < class ExecutionPolicy,

class InputIt, class UnaryOp, class T, class BinaryOp >
T transform_reduce ( ExecutionPolicy && policy,
InputIt first, InputIt last,

UnaryOp unary_op, T init, BinaryOp binary_op ) ;
(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)