SIMD library
SIMD 라이브러리는 데이터 병렬 처리를 명시적으로 표현하고 더 효율적인 SIMD 접근을 위해 데이터를 구조화하기 위한 이식 가능한 타입들을 제공합니다.
simd<T>
타입의 객체는
T
타입의 객체와 유사하게 동작합니다. 하지만
T
가 하나의 값을 저장하고 조작하는 반면,
simd<T>
는 여러 개의 값(이를
width
라고 부르지만 표준 라이브러리의 나머지 부분과의 일관성을 위해
size
로 식별됨; 참조
simd_size
)을 저장하고 조작합니다.
simd<T>
의 모든 연산자와 연산은
요소별(element-wise)
로 동작합니다
(명시적으로
수평(horizontal)
연산으로 표시된 경우는 제외). 이 간단한 규칙은 데이터 병렬성을 표현하며, 컴파일러가 SIMD 명령어 및/또는 독립적인 실행 스트림을 생성하는 데 사용됩니다.
simd<T>
와
native_simd<T>
타입의 너비는 컴파일 타임에 구현에 의해 결정됩니다. 이와 대조적으로,
fixed_size_simd<T, N>
타입의 너비는 개발자에 의해 특정 크기로 고정됩니다.
다양한 SIMD 유형을 혼합하여 높은 효율성으로 사용하기 위한 권장 패턴은 native_simd 와 rebind_simd 를 사용합니다:
#include <experimental/simd> namespace stdx = std::experimental; using floatv = stdx::native_simd<float>; using doublev = stdx::rebind_simd_t<double, floatv>; using intv = stdx::rebind_simd_t<int, floatv>;
이는 모든 타입 집합이 동일한 너비를 가지므로 상호 변환될 수 있도록 보장합니다. 너비가 일치하지 않는 변환은 값을 손실하거나 값을 임의로 생성해야 하기 때문에 정의되지 않습니다. 크기 조정 작업의 경우, SIMD 라이브러리는 split 및 concat 함수를 제공합니다.
|
헤더 파일에 정의됨
<experimental/simd>
|
목차 |
주요 클래스
|
(parallelism TS v2)
|
데이터 병렬 벡터 타입
(클래스 템플릿) |
|
(parallelism TS v2)
|
요소 타입이 bool인 데이터 병렬 타입
(클래스 템플릿) |
ABI 태그
|
다음 네임스페이스에 정의됨
std::experimental::simd_abi
|
|
|
(parallelism TS v2)
|
단일 요소를 저장하기 위한 태그 타입
(typedef) |
|
(parallelism TS v2)
|
지정된 개수의 요소를 저장하기 위한 태그 타입
(alias template) |
|
(parallelism TS v2)
|
ABI 호환성을 보장하는 태그 타입
(alias template) |
|
(parallelism TS v2)
|
가장 효율적인 태그 타입
(alias template) |
|
(parallelism TS v2)
|
fixed에 의해 지원이 보장되는 최대 요소 개수
(constant) |
|
(parallelism TS v2)
|
주어진 요소 타입과 요소 개수에 대한 ABI 타입을 얻음
(class template) |
정렬 태그
|
(parallelism TS v2)
|
로드/스토어 주소의 정렬을 요소 정렬에 맞춤을 나타내는 플래그
(클래스) |
|
(parallelism TS v2)
|
로드/스토어 주소의 정렬을 벡터 정렬에 맞춤을 나타내는 플래그
(클래스) |
|
(parallelism TS v2)
|
로드/스토어 주소의 정렬을 지정된 정렬에 맞춤을 나타내는 플래그
(클래스 템플릿) |
Where 표현식
|
(parallelism TS v2)
|
비변경 작업을 가진 선택된 요소들
(클래스 템플릿) |
|
(parallelism TS v2)
|
변경 작업을 가진 선택된 요소들
(클래스 템플릿) |
|
(parallelism TS v2)
|
const_where_expression과 where_expression을 생성함
(함수 템플릿) |
캐스트
|
(parallelism TS v2)
|
요소별 static_cast
(함수 템플릿) |
|
(parallelism TS v2)
|
요소별 ABI 캐스트
(함수 템플릿) |
|
(parallelism TS v2)
|
단일 simd 객체를 여러 개로 분할
(함수 템플릿) |
|
(parallelism TS v2)
|
여러 simd 객체를 단일 객체로 연결
(함수 템플릿) |
알고리즘
|
(parallelism TS v2)
|
요소별 최소 연산
(함수 템플릿) |
|
(parallelism TS v2)
|
요소별 최대 연산
(함수 템플릿) |
|
(parallelism TS v2)
|
요소별 최소-최대 연산
(함수 템플릿) |
|
(parallelism TS v2)
|
요소별 클램프 연산
(함수 템플릿) |
리덕션
|
(parallelism TS v2)
|
벡터를 단일 요소로 축소
(함수 템플릿) |
마스크 감소
|
(parallelism TS v2)
|
simd_mask
의
bool
로의 축소 연산
(함수 템플릿) |
|
(parallelism TS v2)
|
simd_mask
의
true
값 개수로의 축소 연산
(함수 템플릿) |
|
(parallelism TS v2)
|
simd_mask
의 첫 번째 또는 마지막
true
값 인덱스로의 축소 연산
(함수 템플릿) |
Traits
|
(parallelism TS v2)
|
타입이
simd
또는
simd_mask
타입인지 확인합니다
(클래스 템플릿) |
|
(parallelism TS v2)
|
타입이 ABI 태그 타입인지 확인합니다
(클래스 템플릿) |
|
(parallelism TS v2)
|
타입이 simd 플래그 타입인지 확인합니다
(클래스 템플릿) |
|
(parallelism TS v2)
|
주어진 요소 타입과 ABI 태그의 요소 개수를 얻습니다
(클래스 템플릿) |
|
(parallelism TS v2)
|
vector_aligned
에 적절한 정렬을 얻습니다
(클래스 템플릿) |
|
(parallelism TS v2)
|
simd
또는
simd_mask
의 요소 타입 또는 요소 개수를 변경합니다
(클래스 템플릿) |
수학 함수
<cmath>
내의 모든 함수들 중 특수 수학 함수를 제외하고는
simd
에 대해 오버로드됩니다.
예제
#include <experimental/simd> #include <iostream> #include <string_view> namespace stdx = std::experimental; void println(std::string_view name, auto const& a) { std::cout << name << ": "; for (std::size_t i{}; i != std::size(a); ++i) std::cout << a[i] << ' '; std::cout << '\n'; } template<class A> stdx::simd<int, A> my_abs(stdx::simd<int, A> x) { where(x < 0, x) = -x; return x; } int main() { const stdx::native_simd<int> a = 1; println("a", a); const stdx::native_simd<int> b([](int i) { return i - 2; }); println("b", b); const auto c = a + b; println("c", c); const auto d = my_abs(c); println("d", d); const auto e = d * d; println("e", e); const auto inner_product = stdx::reduce(e); std::cout << "inner product: " << inner_product << '\n'; const stdx::fixed_size_simd<long double, 16> x([](int i) { return i; }); println("x", x); println("cos²(x) + sin²(x)", stdx::pow(stdx::cos(x), 2) + stdx::pow(stdx::sin(x), 2)); }
출력:
a: 1 1 1 1 b: -2 -1 0 1 c: -1 0 1 2 d: 1 0 1 2 e: 1 0 1 4 inner product: 6 x: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 cos²(x) + sin²(x): 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
참고 항목
|
수치 배열, 배열 마스크 및 배열 슬라이스
(클래스 템플릿) |
외부 링크
| 1. | ISO/IEC TS 19570:2018 Section 9 "Data-Parallel Types"의 구현 — github.com |
| 2. |
TS 구현 진행 상황:
GCC/libstdc++
(
std::experimental::simd
는 GCC-11과 함께 배포됨) — gcc.gnu.org
|