Go의 플랫폼 독립적 SIMD

9 hours ago 3

Go 1.27에 추가된 실험적 simd 패키지로 어셈블리를 직접 작성하지 않고도 여러 데이터에 같은 연산을 한꺼번에 적용하는 SIMD 가속을 활용할 수 있음 CPU마다 다른 명령어와 벡터 크기를 공통 API로 감싸, 한 번 작성한 코드를 amd64, arm64, WebAssembly에서 사용할 수 있음 하드웨어에 맞는 연산은 어셈블리에 가까운 성능을 목표로 하며, SIMD를 지원하지 않는 환경에서도 소프트웨어 구현으로 실행 컴파일러가 하드웨어별 코드를 생성하고 적절한 실행 경로를 선택해, 계산 도중 지원 기능을 반복해서 확인하는 비용을 줄임 빌드 시 GOEXPERIMENT=simd 로 활성화하며, 공통 API에 없는 연산은 archsimd로 보완 가능. Go 1.28에서는 지원 연산과 하드웨어 범위를 확대할 계획 어셈블리 없이 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이 코드를 작성하는 경우에도 이 원칙을 중시함 플랫폼마다 다른 벡터 크기와 명령 체계 벡터 크기는 아키텍처별로 고정 여부와 범위가 다름 wasm, PowerPC, s390x는 128비트 고정 크기를 제공함 amd64는 128/256/512비트, loong64는 128/256비트를 제공함 Riscv64는 128...

Read Entire Article