Go 1.27, 모든 플랫폼에서 쓰는 SIMD API 공개
원제 Platform-Independent SIMD in Go
112 포인트댓글 29

Key Point
Go의 SIMD 에뮬레이션 기반 포터블 API 도입으로, 벡터 연산이 필요한 암호화·데이터 처리·AI 알고리즘을 플랫폼 의존성 없이 작성할 수 있게 됐으며, 어셈블리 대신 일반 Go 코드로 성능 최적화가 가능해짐.
핵심 요약
- Go 1.26부터 amd64 SIMD API를, Go 1.27부터 arm64(NEON)와 wasm 지원 추가, 동시에 플랫폼 독립적인 포터블 simd 패키지 도입.
- 기존에는 Go 어셈블리로만 SIMD 접근 가능했으나, 새 API로 고성능 커널이 아닌 일반 소프트웨어도 벡터 연산 활용 가능.
- SIMD는 CPU마다 벡터 크기(128~512비트), 마스킹 방식, 지원 연산이 크게 달라 플랫폼별 구현이 복잡했음.
- simd 패키지는 고정 벡터 크기를 타입에서 제거하고, 모든 플랫폼이 지원하는 연산만 제공하며 나머지는 효율적 에뮬레이션으로 보완.
- Int8s, Float32s 같은 복수 타입으로 벡터 표현하고, LoadFloat32s로 슬라이스에서 로드, Store로 저장, MulAdd 같은 연산 제공.
- Go 1.27은 ReduceSum, OnesCount 등 일부 연산 미포함하나 다음 버전에 추가 예정.
- 비트 연산, 마스킹, 시프트, 리셰이핑 등 광범위한 연산 지원하며, 각 벡터 타입마다 별도 마스크 타입(Mask8s 등) 사용.
- ToArch() 메서드로 아키텍처 특화 SIMD로 전환 후 한계적 연산 직접 구현 가능, 다시 simd.Int8sFromArch()로 복귀.
- GODEBUG=simd=0으로 에뮬레이션만 사용, simd=128/256/512로 특정 벡터 크기 강제, +128/+256/+512로 일부 기능 미지원 용인 가능.
- amd64, arm64, wasm 지원하는 archsimd 패키지도 병행 제공하나, simd 패키지가 포터블 코드 작성의 우선 대안.
- 컴파일러가 SIMD 타입을 크기별 특화 버전으로 변환(@simd128, @simd256 등 접미사) 후, 프로그램 시작 시 감지된 SIMD 레벨로 적절 버전 선택하도록 구현.
- Go 1.28에서 SVE 지원, OnesCount·마스킹·리덕션·셔플 같은 추가 연산 예정, Raspberry Pi처럼 일부 기능만 미지원한 플랫폼용 기능 변형 추가.