Namespaces
Variants

std::experimental:: rebind_simd, std::experimental:: resize_simd

From cppreference.net
헤더 파일에 정의됨 <experimental/simd>
template < class T, class V >
struct rebind_simd ;
(1) (parallelism TS v2)
template < int N, class V >
struct resize_simd ;
(2) (parallelism TS v2)

다른 요소 타입이나 크기를 가진 simd 또는 simd_mask 타입을 생성합니다. 새로운 타입은 V::abi_type 와 다른 ABI 태그 타입을 사용할 가능성이 높습니다.

1) 요소 타입을 T 로 변경하고 크기는 그대로 유지합니다.
2) 크기를 N 으로 변경하고 요소 유형은 그대로 유지합니다.

목차

템플릿 매개변수

T - 새로운 요소 타입; bool 이외의 산술 타입
N - 새로운 요소 개수
V - simd 또는 simd_mask 타입

멤버 타입

이름 정의
type simd 또는 simd_mask 타입으로 다른 요소 타입 (1) 또는 크기 (2)

헬퍼 타입

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

예제

#include <experimental/simd>
#include <iostream>
namespace stdx = std::experimental;
using floatv = stdx::native_simd<float>;
// 내부적으로 double 정밀도 사용
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

참고 항목

(parallelism TS v2)
주어진 요소 타입과 요소 개수에 대한 ABI 타입을 획득함
(클래스 템플릿)