std::experimental::rebind_simd, std::experimental::resize_simd
來自 cppreference.com
< cpp | experimental | simd
定義於標頭檔案 <experimental/simd> |
||
template< class T, class V > struct rebind_simd; |
(1) | (並行技術規範 v2) |
template< int N, class V > struct resize_simd; |
(2) | (並行技術規範 v2) |
建立一個具有不同元素型別或大小的 simd
或 simd_mask
型別。新型別可能使用與 V::abi_type
不同的 ABI 標籤型別。
1) 將元素型別更改為
T
並保持大小不變。2) 將大小更改為
N
並保持元素型別不變。目錄 |
[編輯] 模板引數
T | - | 新的元素型別;除 bool 之外的算術型別 |
N | - | 新的元素數量 |
V | - | 一個 simd 或 simd_mask 型別 |
[編輯] 成員型別
名稱 | 定義 |
型別
|
具有不同元素型別 (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>; // 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
[編輯] 參閱
(並行技術規範 v2) |
獲取給定元素型別和元素數量的 ABI 型別 (類模板) |