命名空间
变体
操作

std::experimental::reduce, std::experimental::hmin, std::experimental::hmax

来自 cppreference.com
< cpp‎ | experimental‎ | simd
 
 
实验性
技术规范
文件系统库 (文件系统 TS)
库基础 (库基础 TS)
库基础 2 (库基础 TS v2)
库基础 3 (库基础 TS v3)
并行扩展 (并行 TS)
并行扩展 2 (并行 TS v2)
并发扩展 (并发 TS)
并发扩展 2 (并发 TS v2)
概念 (概念 TS)
范围 (范围 TS)
反射 (反射 TS)
数学特殊函数 (特殊函数 TR)
实验性非 TS
模式匹配
线性代数
std::execution
契约
二维图形
 
 
 
定义在头文件 <experimental/simd>
template< class T, class Abi, class BinaryOperation = std::plus<> >
T reduce( const simd<T, Abi>& v, BinaryOperation binary_op = {} );
(1) (并行 TS v2)
template< class M, class V, class BinaryOperation >

typename V::value_type
reduce( const const_where_expression<M, V>& x,

        typename V::value_type identity_element, BinaryOperation binary_op = {} );
(2) (并行 TS v2)
template< class M, class V >

typename V::value_type

reduce( const const_where_expression<M, V>& x, std::plus<> binary_op ) noexcept;
(3) (并行 TS v2)
template< class M, class V >

typename V::value_type

reduce( const const_where_expression<M, V>& x, std::multiplies<> binary_op ) noexcept;
(4) (并行 TS v2)
template< class M, class V >

typename V::value_type

reduce( const const_where_expression<M, V>& x, std::bit_and<> binary_op ) noexcept;
(5) (并行 TS v2)
template< class M, class V >

typename V::value_type

reduce( const const_where_expression<M, V>& x, std::bit_or<> binary_op ) noexcept;
(6) (并行 TS v2)
template< class M, class V >

typename V::value_type

reduce( const const_where_expression<M, V>& x, std::bit_xor<> binary_op ) noexcept;
(7) (并行 TS v2)
template< class T, class Abi >
T hmin( const simd<T, Abi>& v ) noexcept;
(8) (并行 TS v2)
template< class M, class V >

typename V::value_type

hmin( const const_where_expression<M, V>& x ) noexcept;
(9) (并行 TS v2)
template< class T, class Abi >
T hmax( const simd<T, Abi>& v ) noexcept;
(10) (并行 TS v2)
template< class M, class V >

typename V::value_type

hmax( const const_where_expression<M, V>& x ) noexcept;
(11) (并行 TS v2)
1) 减少 v 中的所有值,通过 binary_op
2) 减少 x 中的值,其中关联的掩码元素为 true,通过 binary_op
3) 返回 x 中所有值的总和,其中关联的掩码元素为 true
4) 返回 x 中所有值的乘积,其中关联的掩码元素为 true
5) 返回使用按位与聚合 x 中的所有值,其中关联的掩码元素为 true
6) 返回使用按位或聚合 x 中的所有值,其中关联的掩码元素为 true
7) 返回使用按位异或聚合 x 中的所有值,其中关联的掩码元素为 true
8) 减少 v 中的所有值,通过 std::min
9) 减少 x 中的所有值,其中关联的掩码元素为 true,通过 std::min
10) 减少 v 中的所有值,通过 std::max
11) 减少 x 中的所有值,其中关联的掩码元素为 true,通过 std::max

如果 binary_op 不具有结合性或不具有交换性,则行为是不确定的。

内容

[编辑] 参数

v - 要应用归约的 simd 向量
x - 要应用归约的 where 表达式的返回值
identity_element - 充当 binary_op 的标识元素的值;对于所有类型为 V::value_type 的有限 a,必须满足 binary_op(identity_element, a) == a
binary_op - 将以未指定的顺序应用于类型为 V::value_typesimd<V::value_type, A> 的参数的二元 FunctionObject,其 ABI 标签 A 未指定。 binary_op(v, v) 必须可转换为 V

[编辑] 返回值

操作的结果,类型为

1,8,10) T
2-7,9,11) V::value_type

[编辑] 示例

#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);
}

输出

sum of data = 523776

[编辑] 参见

(C++17)
类似于 std::accumulate,但顺序不同
(函数模板) [编辑]