名稱空間
變體
操作

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
契約
2D 圖形
 
 
 
定義於標頭檔案 <experimental/simd>
template< class T, class V >
struct rebind_simd;
(1) (並行技術規範 v2)
template< int N, class V >
struct resize_simd;
(2) (並行技術規範 v2)

建立一個具有不同元素型別或大小的 simdsimd_mask 型別。新型別可能使用與 V::abi_type 不同的 ABI 標籤型別。

1) 將元素型別更改為 T 並保持大小不變。
2) 將大小更改為 N 並保持元素型別不變。

目錄

[編輯] 模板引數

T - 新的元素型別;除 bool 之外的算術型別
N - 新的元素數量
V - 一個 simdsimd_mask 型別

[編輯] 成員型別

名稱 定義
型別 具有不同元素型別 (1) 或大小 (2)simdsimd_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 型別
(類模板) [編輯]