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 표준 기반)를 지원하는 컴파일러가 필요해요.

더 알아보기 (Learn more)

cppreference