---
title: "Go-Highway: Go에서 SIMD 한 번 짜면 AVX2, AVX-512, NEON 다 돌아감"
published: 2026-01-02T22:36:41.000Z
canonical: https://jeff.news/article/330
---
# Go-Highway: Go에서 SIMD 한 번 짜면 AVX2, AVX-512, NEON 다 돌아감

Google Highway C++ 라이브러리에서 영감을 받은 Go용 포터블 SIMD 추상화 라이브러리. 코드 한 벌로 AVX2, AVX-512, ARM NEON, 순수 Go 폴백까지 지원하며, ARM64 벌크 어셈블리 모드에서 GELU F32 기준 117배 성능 향상을 달성함.

- Google의 C++ Highway 라이브러리에서 영감을 받은 Go용 포터블 SIMD 추상화 라이브러리가 공개됨. 핵심은 **코드 한 벌로 AVX2, AVX-512, ARM NEON, 순수 Go 폴백까지 전부 커버**한다는 거임

- Go 1.26+의 `GOEXPERIMENT=simd`를 활용해서 AMD64에서는 네이티브 `simd/archsimd` 패키지를 직접 쓰고, ARM64에서는 GoAT(C→Go 어셈블리 트랜스파일러)로 생성한 어셈블리를 사용하는 구조임. ARM64 쪽은 `simd/archsimd`가 아직 NEON/SVE를 지원 안 해서 이렇게 우회하는 거임

## 지원하는 연산이 꽤 빵빵함

- 기본 SIMD 연산은 하드웨어 명령어에 직접 매핑됨: Load/Store, 산술(Add, Sub, Mul, FMA 등), 비교, 조건부, 비트 연산, 셔플, 타입 캐스트, 리덕션 등 웬만한 건 다 있음
- `LoadSlice`/`StoreSlice`는 안전한(bounds checking) 변형이고, `Load`/`Store`는 성능 크리티컬한 내부 루프용으로 bounds checking을 건너뜀. 호출자가 길이 보장해야 함

## contrib 패키지가 진짜 핵심

- `hwy/contrib/algo`에 Exp, Log, Sin, Cos, Tanh, Sigmoid, Erf 같은 **수학 함수 변환**이 전부 들어있음. `float32`, `float64`, `Float16`, `BFloat16` 다 지원하고 ~4 ULP 정확도임
- ML 관련 패키지도 쏠쏠함: `matmul`(SME/NEON 가속 행렬곱), `matvec`, `activation`(활성화 함수), `nn`(신경망 프리미티브), `loss`, `rabitq`(벡터 양자화), `sort`(SIMD 가속 정렬) 등
- 심지어 `gguf` 파일 포맷 지원까지 있어서 LLM 추론 파이프라인에서 바로 쓸 수 있겠다는 느낌임

## 성능: ARM64 벌크 어셈블리 모드가 117배 빠름

- `hwygen`이라는 코드 생성기가 제네릭 구현에서 타겟별 최적화 코드를 자동 생성해줌
- ARM64에서 `neon:asm` 모드를 쓰면 GoAT로 C→Go 어셈블리 트랜스파일을 하는데, 이러면 벡터 단위 함수 호출 오버헤드가 사라짐

> [!IMPORTANT]
> Apple M4 Max 기준 1024개 엘리먼트 벤치마크: GELU F32가 Per-Vector 모드 67,581ns → 벌크 어셈블리 모드 577ns로 **117배 속도 향상**. F64도 68배 빠름.

- 단, 어셈블리 모드는 matmul이나 element-wise 같은 연산에 적합하고, softmax처럼 복잡한 제어 흐름이나 리덕션이 있으면 기본 GoSimd 모드가 나음

## 지원 아키텍처

- AMD64: AVX2(256비트), AVX-512(512비트) — Go 1.26 네이티브
- ARM64: NEON(128비트), SVE Darwin(512비트 고정), SVE Linux(스케일러블), SME(스케일러블, 행렬 연산) — GoAT 어셈블리
- Pure Go 스칼라 폴백도 항상 있음
- SME는 Apple Silicon M4 이상에서 전용 행렬곱 하드웨어를 활용하는 거임

- 라이센스는 Apache 2.0. Go에서 SIMD 성능이 필요했던 사람이라면 꽤 진지하게 볼 만한 프로젝트임

## 핵심 포인트

- Go 1.26+ GOEXPERIMENT=simd 활용, AMD64는 네이티브 archsimd, ARM64는 GoAT 어셈블리
- ML용 contrib 패키지 포함: matmul, activation, nn, loss, gguf 등
- ARM64 neon:asm 벌크 모드에서 GELU F32 117배, F64 68배 속도 향상
- SME(Apple M4+) 전용 행렬곱 하드웨어 지원

## 인사이트

Go 생태계에서 SIMD가 본격적으로 쓸 만해지는 신호. 특히 ML 추론 파이프라인에서 cgo 없이 순수 Go로 SIMD 성능을 뽑을 수 있다는 게 매력적임.
