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型を取得する (クラステンプレート) |