名前空間
変種
操作

std::experimental::rebind_simd、std::experimental::resize_simd

From cppreference.com
< cpp‎ | experimental‎ | simd
 
 
 
 
 
ヘッダー <experimental/simd> で定義
template< class T, class V >
struct rebind_simd;
(1) (parallelism TS v2)
template< int N, class V >
struct resize_simd;
(2) (parallelism 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;
(parallelism TS v2)
template< int N, class V >
using resize_simd_t = typename resize_simd<N, V>::type;
(parallelism 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

[編集] 関連項目

(parallelism TS v2)
与えられた要素型と要素数に対するABI型を取得する
(クラステンプレート) [編集]
English 日本語 中文(简体) 中文(繁體)