원문 캡처 · wrocpp.github.io
원문 캡처 · wrocpp.github.io

C++26은 명령어 집합에 종속되지 않는 벡터 연산 라이브러리 <simd>를 표준화한다. GCC 16.1에는 표준 헤더가 아직 없지만, 같은 프로그래밍 모델을 제공하는 실험용 헤더 <experimental/simd>로 지금 시험할 수 있다.

std::simd<float> a = 1.5f; std::simd<float> b = 2.0f; auto c = a * b; // one instruction, whatever the target supports

라이브러리는 대상 하드웨어에 맞는 벡터 너비를 선택한다. 같은 코드를 SSE, AVX-512 또는 NEON으로 컴파일할 수 있으며, 아키텍처별 내장 함수나 #ifdef가 필요하지 않다. 벡터화가 최적화기의 부수 효과에 좌우되는 대신 코드에 명시된다.

GCC 16.1의 libstdc++는 아직 표준 <simd> 헤더를 제공하지 않으며, __cpp_lib_simd도 정의하지 않는다. 대신 표준 타입의 기반이 된 Parallelism TS 버전을 제공한다. Compiler Explorer에서는 GCC 16.1, -std=c++26, <experimental/simd> 설정으로 시험할 수 있다. 해당 환경의 x86-64 기본 대상에서는 벡터 하나가 float 네 개를 담고, 곱셈 한 번으로 결과 네 개를 낸다. -march=x86-64-v3로 컴파일하면 너비가 8이 되며, ARM에서는 NEON을 사용한다.

나중에 표준 타입으로 옮길 때는 주로 이름을 바꾸면 된다. std::experimental::native_simd<float>는 std::simd<float>로 바뀌며, 산술 연산자와 레인별 조건에 쓰는 simd_mask, 로드·저장 도우미는 그대로 이어진다.

<simd>는 픽셀·오디오 버퍼, 물리 계산, 거리 및 내적 연산처럼 각 요소에 같은 연산을 적용하는 데이터 병렬 처리에 적합하다. 다만 일반 루프의 자동 벡터화를 대체하지 않으며, 메모리 대역폭이나 의존성 사슬이 병목인 코드를 해결해 주지는 않는다. 코드를 바꾸기 전에 어셈블리와 llvm-mca로 확인하는 방법을 참고할 수 있다.