命名空间
变体
操作

std::experimental::rebind_simd, std::experimental::resize_simd

来自 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 V >
struct rebind_simd;
(1) (并行 TS v2)
template< int N, class V >
struct resize_simd;
(2) (并行 TS v2)

创建具有不同元素类型或大小的 simdsimd_mask 类型。新类型可能使用与 V::abi_type 不同的 ABI 标签类型。

1) 将元素类型更改为 T 并保持大小不变。
2) 将大小更改为 N 并保持元素类型不变。

内容

[编辑] 模板参数

T - 新的元素类型;除 bool 之外的算术类型
N - 新的元素数量
V - a simd or simd_mask 类型

[编辑] 成员类型

名称 定义
type 具有不同元素类型 (1) 或大小 (2)simdsimd_mask 类型

[编辑] 辅助类型

template< class T, class V >
using rebind_simd_t = typename rebind_simd<T, V>::type;
(并行 TS v2)
template< int N, class V >
using resize_simd_t = typename resize_simd<N, V>::type;
(并行 TS v2)

[编辑] 示例

#include <experimental/simd>
#include <iostream>
 
namespace stdx = std::experimental;
using floatv = stdx::native_simd<float>;
 
// use double precision internally
floatv dp(floatv x)
{
    using doublev = stdx::rebind_simd_t<double, floatv>;
    return stdx::static_simd_cast<floatv>(stdx::simd_cast<doublev>(x) - 1.234);
}
 
template<class T>
stdx::resize_simd_t<T::size() / 2, T> partial_reduction(T x)
{
    auto [lo, hi] = stdx::split<stdx::resize_simd_t<T::size() / 2, T>>(x);
    return lo + hi;
}
 
int main() 
{
    floatv x([](auto i) { return 1.234f + std::numeric_limits<float>::epsilon() * i; });
    x = dp(x);
    const auto y = partial_reduction(x);
    for (unsigned i = 0; i < y.size(); ++i)
        std::cout << y[i] << ' ';
    std::cout << '\n';
}

可能的输出

1.73569e-07 4.11987e-07

[编辑] 另请参阅

(并行 TS v2)
获取给定元素类型和元素数量的 ABI 类型
(类模板) [编辑]