simd — 데이터 병렬 타입
simd — 데이터 병렬 타입 (Data-parallel types, SIMD)
SIMD 라이브러리(<experimental/simd> / C++26 std::simd)는 데이터 병렬 타입과 그 연산을 제공해요. 명시적으로 데이터 병렬성을 나타내고, SIMD 레지스터·명령어 같은 데이터 병렬 실행 자원(공통 명령 디코더로 구동되는 실행 유닛)이 가능하면 이를 통해 데이터를 구조화하는 이식성 있는 타입이에요.
출처: cppreference
본문
핵심 개념
std::simd<T, Abi>는 T 타입 값들을 병렬로 담는 "고정 크기 벡터"예요. 일반 벡터와 달리 요소 수가 컴파일 타임에 정해지고, 연산이 요소별(element-wise)로 병렬 실행돼요.
#include <experimental/simd>
namespace stdx = std::experimental;
stdx::simd<float, stdx::simd_abi::native<float>> a, b;
// a, b는 하드웨어 SIMD 폭만큼의 float를 담음
auto c = a + b; // 요소별 병렬 덧셈
auto d = a * 3.0f; // 스칼라와의 연산
주요 연산
- 산술 —
+,-,*,/, 단항 - 비교 —
==,<등 (마스크 결과) - 감소 —
reduce_add(),reduce_max()등 - 마스크 —
std::simd_mask, 조건부 선택select() - 변환 — 스칼라/배열과의 변환
stdx::simd<float, stdx::simd_abi::scalar> v{1.0f, 2.0f, 3.0f, 4.0f};
float sum = stdx::reduce_add(v); // 10.0f
// 마스크 기반 선택
auto mask = v > 2.0f;
auto r = stdx::select(mask, v, 0.0f); // 2보다 크면 v, 아니면 0
특징
- 이식성 —
simd_abi::native가 하드웨어에 맞는 폭을 선택. 코드는 그대로 두고 하드웨어에 최적화. - 명시적 데이터 병렬성 — 컴파일러가 벡터화를 명확히 할 수 있어 성능 향상.
- 신호 처리, 물리, 그래픽, 머신러닝 등 수치 연산의 성능 최적화에 사용.
// 루프 벡터화를 명시적으로
stdx::simd<float, stdx::simd_abi::native<float>> sum{0};
for (size_t i = 0; i < n; i += width) {
auto chunk = load(ptr + i); // SIMD 로드
sum += chunk * chunk; // 병렬 연산
}
std::simd는 수치 성능이 중요한 코드에서 벡터화를 이식성 있게 활용하는 현대 C++의 도구예요. C++26 표준화 단계로 <experimental/simd>(C++26 표준 기반)를 지원하는 컴파일러가 필요해요.