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) (隐式声明) |
2) 广播构造函数构造一个
simd
,所有值均以 value 初始化。此重载只有在从 U
向 T
的转换保留值,或者 U
为 int 或当 T
为无符号整数类型时为 unsigned int 时才会参与重载决议。3) 构造一个
simd
,使得对于范围 [
0,
size()
)
中的所有 i,第 i 个元素以 static_cast<T>(other[i]) 初始化。此重载只有在Abi
为 simd_abi::fixed_size<size()> 且从 U
向 T
的转换保留值,并且,如果 U
和 T
都为整型,则 T
的整数转换等级大于 U
的整数转换等级时才会参与重载决议。4) 生成器构造函数构造一个
simd
,其第 i 个元素以 generator(std::integral_constant<std::size_t, i>()) 初始化。此重载只有在对于范围 [
0,
size()
)
中的所有 i,simd(gen(std::integral_constant<std::size_t, i>()))
时才会参与重载决议 均良构。对 generator 的调用之间无顺序。generator不能调用向量化不安全的标准库函数。6,7) 隐式声明的复制和移动构造函数。构造一个
simd
,其各个元素以 other 中的元素初始化。参数
value | - | 用于初始化所有 simd 元素的值 |
other | - | 从之复制的另一 simd |
generator | - | 用于初始化每个 simd 元素的函数对象 |
mem | - | 指向数组的指针,其中 [ mem, mem + size()) 为有效范围 |
flags | - | 如果对于类型 vector_aligned_tag,则加载构造函数可能假设 mem 指向按 memory_alignment_v<simd, U> 对齐的存储 |
类型要求 | ||
-
从 U 向 T 的转换必须保持值。广播构造函数 (2) 还允许 U 为 int,或当 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 元素 (公开成员函数) |