std::experi...:resize_simd(3)

πŸ“¦ version 2024.07.05, in nixpkgs unstable, opensuse-leap 16.0

πŸ’… NAME πŸ’…

okay so this page is std::experi...:resize_simd(3) β€” that's the header title, ellipsis and all, bestie β€” from the C++ Standard Libary manual (yes, β€œLibary”, not a typo from me πŸ’€). The NAME line is literally:

std::experimental::rebind_simd,std::experimental::resize_simd β€” std::experimental::rebind_simd,std::experimental::resize_simd

It's giving template-alias realness for the parallelism TS v2 girlies πŸ’…βœ¨


✨ Synopsis ✨

Defined in header <experimental/simd>:

template< class T, class V >          (1) (parallelism TS v2)
struct rebind_simd;
template< int N, class V >            (2) (parallelism TS v2)
struct resize_simd;

These bad boys create 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 β€” yes, β€œlikely” is literally the word on the page πŸ‘€.

  • (1) Changes the element type to T and keeps the size unchanged.
  • (2) Changes the size to N and keeps the element type unchanged.

🧚 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

πŸ’– Member types πŸ’–

Name β†’ Definition tea β˜•: type is a simd or simd_mask type with a different element type (1) or size (2).


πŸ¦‹ Helper types πŸ¦‹

The helper aliases are here and they are iconic:

template< class T, class V >                             (parallelism TS v2)
using rebind_simd_t = typename rebind_simd<T, V>::type;
template< int N, class V >                               (parallelism TS v2)
using resize_simd_t = typename resize_simd<N, V>::type;

πŸ“ Example πŸ“

The original says // Run this code β€” so run it, bestie 😭:

#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

πŸ‘‘ See also πŸ‘‘

See also is serving these entries:

  • deduce β€” obtains an ABI type for given element type and number of elements
  • deduce_t β€” obtains an ABI type for given element type and number of elements; tagged (parallelism TS v2) (class template)

source/version + date tea β˜•: this page comes from http://cppreference.com, dated 2024.06.10, with footer title std::experi...:resize_simd(3). bye bestie, go rebind/resize those simd types πŸ’…βœ¨πŸ«Ά

πŸ“¦ where this page comes from