std::experimental::simd<T,Abi>::simd

< cpp‎ | experimental‎ | simd‎ | simd
simd() noexcept = default;
(1) (并行 TS v2)
template< class U >
simd( U&& value ) noexcept;
(2) (并行 TS v2)
template< class U >
simd( const simd<U, simd_abi::fixed_size<size()>>& other ) noexcept;
(3) (并行 TS v2)
template< class G >
explicit simd( G&& generator ) noexcept;
(4) (并行 TS v2)
template< class U, class Flags >
simd( const U* mem, Flags flags );
(5) (并行 TS v2)
simd( const simd& other ) noexcept = default;
(6) (并行 TS v2)
(隐式声明)
simd( simd&& other ) noexcept = default;
(7) (并行 TS v2)
(隐式声明)
1)默认初始化(无初始化式)或值初始化(空初始化式)构造一个 simd
2) 广播构造函数构造一个 simd,所有值均以 value 初始化。此重载只有在从 UT 的转换保留值,或者 Uint 或当 T 为无符号整数类型时为 unsigned int 时才会参与重载决议。
3) 构造一个 simd,使得对于范围 [0size()) 中的所有 i,第 i 个元素以 static_cast<T>(other[i]) 初始化。此重载只有在Abisimd_abi::fixed_size<size()> 且从 UT 的转换保留值,并且,如果 UT 都为整型,则 T 的整数转换等级大于 U 的整数转换等级时才会参与重载决议。
4) 生成器构造函数构造一个 simd,其第 i 个元素以 generator(std::integral_constant<std::size_t, i>()) 初始化。此重载只有在对于范围 [0size()) 中的所有 isimd(gen(std::integral_constant<std::size_t, i>()))时才会参与重载决议 均良构。对 generator 的调用之间无顺序。generator不能调用向量化不安全的标准库函数。
5) 加载构造函数构造 simd,使得对于范围 [0size()) 中的所有 i,其第 i 个元素以 static_cast<T>(mem[i]) 初始化。
6,7) 隐式声明的复制和移动构造函数。构造一个 simd,其各个元素以 other 中的元素初始化。

参数

value - 用于初始化所有 simd 元素的值
other - 从之复制的另一 simd
generator - 用于初始化每个 simd 元素的函数对象
mem - 指向数组的指针,其中 [memmem + size()) 为有效范围
flags - 如果对于类型 vector_aligned_tag,则加载构造函数可能假设 mem 指向按 memory_alignment_v<simd, U> 对齐的存储
类型要求
-
UT 的转换必须保持值。广播构造函数 (2) 还允许 Uint,或当 T 为无符号整数类型时为 unsigned int
-
is_simd_flag_type_v<Flags> 必须为 true

示例

#include <cstddef>
#include <experimental/simd>
#include <iostream>
namespace stdx = std::experimental;
 
int main()
{
    stdx::native_simd<int> a; // 未初始化
    a = 1; // 将所有元素设为 1
    stdx::native_simd<int> b([](int i) { return i; }); // {0, 1, 2, 3, ...}
 
    alignas(stdx::memory_alignment_v<stdx::native_simd<int>>)
        std::array<int, stdx::native_simd<int>::size() * 2> mem = {};
    for (std::size_t i = 0; i < mem.size(); ++i)
        mem[i] = i & 1;
 
    stdx::native_simd<int> c(&mem[0], stdx::vector_aligned); // {0, 1, 0, 1, ...}
    stdx::native_simd<int> d(&mem[1], stdx::element_aligned); // {1, 0, 1, 0, ...}
 
    auto sum = a + b + c + d;
 
    for (std::size_t i = 0; i < sum.size(); ++i)
        std::cout << sum[i] << ' ';
    std::cout << '\n';
}

可能的输出:

2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17

参阅

(并行 TS v2)
从连续内存加载 simd 元素
(公开成员函数)