Namespaces
Variants

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

From cppreference.net
定义于头文件 <experimental/simd>
template < class T, class V >
struct rebind_simd ;
(1) (并行 TS v2)
template < int N, class V >
struct resize_simd ;
(2) (并行 TS v2)

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

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

目录

模板参数

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

成员类型

名称 定义
type 具有不同元素类型 (1) 或尺寸 (2) simd simd_mask 类型

辅助类型

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

示例

#include <experimental/simd>
#include <iostream>
namespace stdx = std::experimental;
using floatv = stdx::native_simd<float>;
// 内部使用双精度
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

参见

(并行技术规范 v2)
获取指定元素类型和元素数量的 ABI 类型
(类模板)