| 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 |
| Parallel exceptions | ||||
| Additional execution policies | ||||
| Algorithms | ||||
| Task blocks | ||||
| Data-parallel vectors | ||||
Defined in header <experimental/simd> | ||
template<class T,class Abi,class BinaryOperation=std::plus<>> T reduce(const simd<T, Abi>& v, BinaryOperation binary_op={}); | (1) | (parallelism TS v2) |
template<class M,class V,class BinaryOperation> typename V::value_type | (2) | (parallelism TS v2) |
template<class M,class V> typename V::value_type | (3) | (parallelism TS v2) |
template<class M,class V> typename V::value_type | (4) | (parallelism TS v2) |
template<class M,class V> typename V::value_type | (5) | (parallelism TS v2) |
template<class M,class V> typename V::value_type | (6) | (parallelism TS v2) |
template<class M,class V> typename V::value_type | (7) | (parallelism TS v2) |
template<class T,class Abi> T hmin(const simd<T, Abi>& v)noexcept; | (8) | (parallelism TS v2) |
template<class M,class V> typename V::value_type | (9) | (parallelism TS v2) |
template<class T,class Abi> T hmax(const simd<T, Abi>& v)noexcept; | (10) | (parallelism TS v2) |
template<class M,class V> typename V::value_type | (11) | (parallelism TS v2) |
The behavior is non-deterministic ifbinary_op is not associative or not commutative.
Contents |
| v | - | thesimd vector to apply the reduction to |
| x | - | the return value of awhere expression to apply the reduction to |
| identity_element | - | a value that acts as identity element forbinary_op;binary_op(identity_element, a)== a must hold for all finitea of typeV::value_type |
| binary_op | - | binaryFunctionObject that will be applied in unspecified order to arguments of typeV::value_type orsimd<V::value_type, A>, with unspecified ABI tagA.binary_op(v, v) must be convertible toV |
The result of operation of the type:
T#include <array>#include <cassert>#include <cstddef>#include <experimental/simd>#include <functional>#include <iostream>#include <numeric>namespace stdx= std::experimental; int main(){using V= stdx::native_simd<double>; alignas(stdx::memory_alignment_v<V>)std::array<V::value_type,1024> data;std::iota(data.begin(), data.end(),0); V::value_type acc{};for(std::size_t i=0; i< data.size(); i+= V::size()) acc+= stdx::reduce(V(&data[i], stdx::vector_aligned),std::plus{});std::cout<<"sum of data = "<< acc<<'\n'; using W= stdx::fixed_size_simd<int,4>; alignas(stdx::memory_alignment_v<W>)std::array<int,4> arr{2,5,4,1};auto w= W(&arr[0], stdx::vector_aligned);assert(stdx::hmin(w)==1 and stdx::hmax(w)==5);}
Output:
sum of data = 523776
(C++17) | similar tostd::accumulate, except out of order (function template)[edit] |