std::experimental:: rebind_simd, std::experimental:: resize_simd
From cppreference.net
<
cpp
|
experimental
|
simd
|
헤더 파일에 정의됨
<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 타입을 획득함
(클래스 템플릿) |