std::experimental::rebind_simd, std::experimental::resize_simd
出自cppreference.com
| 在標頭 <experimental/simd> 定義
|
||
| |
(1) | (並行 TS v2) |
| |
(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 類型
|
輔助類型
| |
(並行 TS v2) | |
| |
(並行 TS 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
參閱
(並行 TS v2) |
獲得給定的元素類型及元素數的 ABI 類型 (類模板) |