| Technical Specification | ||||
| Filesystem library(filesystem TS) | ||||
| Library fundamentals(library fundamentals TS) | ||||
| Library fundamentals 2(library fundamentals TS v2) | ||||
| Library fundamentals 3(library fundamentals TS v3) | ||||
| Extensions for parallelism(parallelism TS) | ||||
| Extensions for parallelism 2(parallelism TS v2) | ||||
| Extensions for concurrency(concurrency TS) | ||||
| Extensions for concurrency 2(concurrency TS v2) | ||||
| Concepts(concepts TS) | ||||
| Ranges(ranges TS) | ||||
| Reflection(reflection TS) | ||||
| Mathematical special functions(special functions TR) | ||||
| Experimental Non-TS | ||||
| Pattern Matching | ||||
| Linear Algebra | ||||
| std::execution | ||||
| Contracts | ||||
| 2D Graphics |
| Execution policies | ||||
| Parallel algorithms | ||||
| Parallel exceptions | ||||
| Parallelized version of existing algorithms | ||||
| New algorithms | ||||
parallel::reduce | ||||
Defined in header <experimental/numeric> | ||
template<class InputIt> typenamestd::iterator_traits<InputIt>::value_type reduce( | (1) | (parallelism TS) |
template<class ExecutionPolicy,class InputIterator> typenamestd::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), possibly permuted and aggregated in unspecified manner, along with the initial valueinit overbinary_op.The behavior is non-deterministic ifbinary_op is not associative or not commutative.
The behavior is undefined ifbinary_op modifies any element or invalidates any iterator in[first, last).
Contents |
| first, last | - | the range of elements to apply the algorithm to |
| init | - | the initial value of the generalized sum |
| policy | - | theexecution policy |
| binary_op | - | binaryFunctionObject that will be applied in unspecified order to the result of dereferencing the input iterators, the results of otherbinary_op andinit |
| Type requirements | ||
-InputIt must meet the requirements ofLegacyInputIterator. | ||
Generalized sum ofinit and*first,*(first+1), ...*(last-1) overbinary_op,
where generalized sumGSUM(op, a1, ..., aN) is defined as follows:
in other words, the elements of the range may be grouped and rearranged in arbitrary order.
O(last - first) applications ofbinary_op.
policy isparallel_vector_execution_policy,std::terminate is called.policy issequential_execution_policy orparallel_execution_policy, the algorithm exits with anexception_list containing all uncaught exceptions. If there was only one uncaught exception, the algorithm may rethrow it without wrapping inexception_list. It is unspecified how much work the algorithm will perform before returning after the first exception was encountered.policy is some other type, the behavior is implementation-defined.exception_list when handling a user exception),std::bad_alloc is thrown.If the range is empty,init is returned, unmodified.
policy is an instance ofsequential_execution_policy, all operations are performed in the calling thread.policy is an instance ofparallel_execution_policy, operations may be performed in unspecified number of threads, indeterminately sequenced with each other.policy is an instance ofparallel_vector_execution_policy, execution may be both parallelized and vectorized: function body boundaries are not respected and user code may be overlapped and combined in arbitrary manner (in particular, this implies that a user-provided Callable must not acquire a mutex to access a shared resource).reduce is the out-of-order version ofstd::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";}}
Possible output:
std::accumulate result 5000003.50000 took 12.7365 msparallel::reduce result 5000003.50000 took 5.06423 ms
| sums up or folds a range of elements (function template)[edit] | |
| applies a function to a range of elements, storing results in a destination range (function template)[edit] | |
(parallelism TS) | applies a functor, then reduces out of order (function template)[edit] |