Go의 플랫폼 독립적 SIMD

1 week ago 12

Go 1.27에 플랫폼과 벡터 크기에 독립적인 실험적 simd API가 추가됨. SIMD 지원 플랫폼에서는 한 번 작성한 코드로 어셈블리에 가까운 성능을 내고, 미지원 플랫폼에서는 에뮬레이션으로 실행하는 것이 목표임 고정 크기 벡터를 타입 시스템에서 제거하고 플랫폼 간 공통 연산을 제공하며, 부족한 기능은 다른 SIMD 명령을 조합해 보완함 현재 amd64의 AVX/AVX2/AVX512, arm64의 NEON, wasm SIMD를 지원함. 빌드 시 GOEXPERIMENT=simd로 활성화하며, SIMD 하드웨어나 구현 지원이 없는 플랫폼에서도 모든 연산을 에뮬레이션함 공통 API로 부족한 부분은 archsimd와 상호 변환해 아키텍처별로 구현할 수 있음. 이식성을 유지하려면 각 플랫폼용 구현과 에뮬레이션 대체 경로도 작성해야 함 컴파일러가 SIMD 수준별 특수화 코드를 생성해 SIMD 계산 내부의 디스패치 비용을 피함. Go 1.28에서는 SVE 지원, 추가 연산, 일부 명령만 빠진 하드웨어를 위한 기능 변형을 추진함 어셈블리 없이 SIMD를 사용하는 실험적 API SIMD(Single Instruction Multiple Data) 는 데이터 벡터에 동일한 연산을 빠르게 적용하는 CPU 기능으로, 단일 명령으로 float64 값 8쌍을 더하는 작업 등이 가능함 암호화, 데이터 처리, AI처럼 계산량이 많은 작업을 가속할 수 있음 Go의 Green Tea 가비지 컬렉터도 살아 있는 객체를 찾는 메모리 스캔에 SIMD를 활용함 기존 Go에서는 Go 어셈블리를 작성해야 SIMD를 사용할 수 있었음 성능이 특히 중요한 계산 커널에서만 투자할 만한 방식이어서, SIMD의 이점을 얻을 수 있는 소프트웨어도 CPU 기능을 충분히 활용하지 못했음 archsimd 는 아키텍처 종속 SIMD API로, Go 1.26에서 amd64 지원을 도입하고 Go 1.27에서 arm64 NEON과 wasm 지원을 추가함 Go 1.27의 simd 는 C++용 Highway를 느슨하게 참고한 완전 이식형 인터페이스임 특정 벡터 크기에 묶이지 않는 여러 데이터 처리 알고리듬을 지원하는 것이 목표임 소스 연산이 하드웨어와 맞으면 어셈블리 수준의 효율을, 그렇지 않으면 가능한 한 효율적인 에뮬레이션을 지향함 사람이 읽고 이해하기 쉬워야 하며, LLM이 코드를 작성하는 경우에도 이 원칙을 중시함 플랫폼마다 다른 벡터 크기와 명령 체계 벡터 크기는 아...

Read Entire Article