Namespaces
Variants

SIMD library

From cppreference.net

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)
로드/스토어 주소의 정렬을 지정된 정렬에 맞춤을 나타내는 플래그
(클래스 템플릿)

Where 표현식

(parallelism TS v2)
비변경 작업을 가진 선택된 요소들
(클래스 템플릿)
(parallelism TS v2)
변경 작업을 가진 선택된 요소들
(클래스 템플릿)
(parallelism TS v2)
const_where_expression과 where_expression을 생성함
(함수 템플릿)

캐스트

(parallelism TS v2)
요소별 static_cast
(함수 템플릿)
요소별 ABI 캐스트
(함수 템플릿)
(parallelism TS v2)
단일 simd 객체를 여러 개로 분할
(함수 템플릿)
(parallelism TS v2)
여러 simd 객체를 단일 객체로 연결
(함수 템플릿)

알고리즘

(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