핵심 요약
- Go 언어 최신 실험 버전(GOEXPERIMENT=simd)에서 하드웨어 SIMD 연산을 직접 다룰 수 있는 패키지가 추가되었습니다.
- 그동안 수기 어셈블리 작성으로만 가능했던 벡터 레지스터 병렬 연산을 일반 Go 코드 형태로 작성할 수 있게 되었습니다.
- 슬라이스에서 데이터를 한 번에 읽고(Load), 연산 후(Operate), 저장(Store)하는 3단계 사이클을 통해 대량의 수치 연산 성능을 크게 높일 수 있습니다.
요약 Go 언어에서 그동안 직접 어셈블리를 작성해야만 쓸 수 있었던 CPU 하드웨어 가속 기술 'SIMD(단일 명령 다중 데이터)' 기능이 마침내 공식 패키지로 지원될 예정입니다. 일반적인 Go 루프문에서 슬라이스의 두 요소를 더할 때는 CPU가 한 단계에 한 쌍씩 순차적으로 처리하지만, 최신 CPU 하드웨어에는 한 번에 8쌍 이상의 데이터를 동시에 처리할 수 있는 SIMD 전용 벡터 레지스터(128, 256, 512비트 등)가 탑재되어 있습니다.
이번에 공개된 실험적 기능(Go 1.27 기준 `GOEXPERIMENT=simd`)에 따르면, Go는 저수준 CPU 아키텍처에 맞춘 `simd/archsimd` 패키지와 이를 추상화한 이식성 높은 `simd` 패키지 두 가지를 제공합니다. 기본적인 동작 과정은 메모리 슬라이스에서 여러 개의 값을 한 번에 레지스터로 읽어오는 'Load', 레지스터 내 각 레인별로 연산을 동시에 수행하는 'Operate', 연산 결과를 다시 메모리에 저장하거나 값을 추출하는 'Store'의 3단계 사이클을 거칩니다.
예를 들어 256비트 레지스터를 사용하는 `Float32x8` 타입을 활용하면, 단 한 번의 명령어로 8개의 float32 값을 동시에 더할 수 있어 이미지 처리, 오디오 가공, 머신러닝 등 동일 연산이 대량으로 반복되는 작업에서 극적인 성능 향상을 기대할 수 있습니다. 수기 어셈블리 작성의 번거로움 없이 일반적인 Go 문법 형태로 고성능 벡터 연산을 작성할 수 있게 되었다는 점에서 개발자들의 기대를 모으고 있습니다.
Sponsored · 광고