std::experimental::reduce, std::experimental::hmin, std::experimental::hmax
From cppreference.com
< cpp | experimental | simd
Defined in header <experimental/simd>
|
||
template< class T, class Abi, class BinaryOperation = std::plus<> > T |
(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) |
1) Reduces all values in v over binary_op.
2) Reduces the values in x where the associated mask element is true over binary_op.
3) Returns the sum of all values in x where the associated mask element is true.
4) Returns the product of all values in x where the associated mask element is true.
5) Returns the aggregation using bitwise-and of all values in x where the associated mask element is true.
6) Returns the aggregation using bitwise-or of all values in x where the associated mask element is true.
7) Returns the aggregation using bitwise-xor of all values in x where the associated mask element is true.
The behavior is non-deterministic if binary_op is not associative or not commutative.
Parameters
v | - | the simd vector to apply the reduction to
|
x | - | the return value of a where expression to apply the reduction to
|
identity_element | - | a value that acts as identity element for binary_op; binary_op(identity_element, a) == a must hold for all finite a of type V::value_type |
binary_op | - | binary FunctionObject that will be applied in unspecified order to arguments of type V::value_type or simd<V::value_type, A>, with unspecified ABI tag A . binary_op(v, v) must be convertible to V .
|
Return value
This section is incomplete |
Example
Run this code
#include <array> #include <cstddef> #include <iostream> #include <numeric> #include <experimental/simd> namespace stdx = std::experimental; int main() { using V = stdx::native_simd<float>; V acc = 0; alignas(stdx::memory_alignment_v<V>) std::array<float, 1024> data; std::iota(data.begin(), data.end(), 0); for (std::size_t i = 0; i < data.size(); i += acc.size()) acc += V(&data[i], stdx::vector_aligned); std::cout << "reduce(" << acc[0]; for (std::size_t i = 1; i < V::size(); ++i) std::cout << ", " << acc[i]; std::cout << ") = (1024 - 1) * 1024 / 2 = " << reduce(acc) << '\n'; }
Possible output:
reduce(130560, 130816, 131072, 131328) = (1024 - 1) * 1024 / 2 = 523776
See also
(C++17) |
similar to std::accumulate, except out of order (function template) |