std::experimental::rebind_simd, std::experimental::resize_simd
From cppreference.com
< cpp | experimental | simd
C++
Feature test macros (C++20)
Concepts library (C++20)
Metaprogramming library (C++11)
Ranges library (C++20)
Filesystem library (C++17)
Concurrency support library (C++11)
Execution control library (C++26)
Experimental
Filesystem library (filesystem TS)
Library fundamentals (library fundamentals TS)
Library fundamentals 2 (library fundamentals TS v2)
Library fundamentals 3 (library fundamentals TS v3)
Extensions for parallelism (parallelism TS)
Extensions for parallelism 2 (parallelism TS v2)
Extensions for concurrency (concurrency TS)
Extensions for concurrency 2 (concurrency TS v2)
Concepts (concepts TS)
Ranges (ranges TS)
Reflection (reflection TS)
Mathematical special functions (special functions TR)
Extensions for parallelism v2
Parallel exceptions
Additional execution policies
Algorithms
Task blocks
Defined in header
<experimental/simd>
template< class T, class V >
struct rebind_simd;
(1)
(parallelism TS v2)
struct rebind_simd;
template< int N, class V >
struct resize_simd;
(2)
(parallelism TS v2)
struct resize_simd;
Creates a simd
or simd_mask
type with a different element type or size. The new type likely uses an ABI tag type different from V::abi_type
.
1) Changes the element type to
T
and keeps the size unchanged.2) Changes the size to
N
and keeps the element type unchanged.[edit] Template parameters
T
-
the new element type; an arithmetic type other than bool
N
-
the new number of elements
V
-
a simd or simd_mask type
[edit] Member types
Name
Definition
type
simd
or simd_mask
type with a different element type (1) or size (2)
[edit] Helper types
template< class T, class V >
using rebind_simd_t = typename rebind_simd<T, V>::type;
(parallelism TS v2)
using rebind_simd_t = typename rebind_simd<T, V>::type;
template< int N, class V >
using resize_simd_t = typename resize_simd<N, V>::type;
(parallelism TS v2)
using resize_simd_t = typename resize_simd<N, V>::type;
[edit] Example
Run this code
#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'; }
Possible output:
1.73569e-07 4.11987e-07
[edit] See also
(parallelism TS v2)
(class template) [edit]