일간
Go에 플랫폼 독립 SIMD가 실험으로 들어왔다
원문 Go Blog ↗
Go 팀의 David Chase와 Junyang Shao가 9월 24일 Go 블로그에 썼습니다. Go 1.26~1.27에 걸쳐 들어온 실험적 SIMD API 이야기입니다.
설계 — 벡터 크기를 타입에서 뺐다
SIMD는 한 명령으로 여러 데이터를 처리하는 CPU 기능인데, 벡터 폭이 CPU마다 다릅니다(128/256/512비트). 다른 언어의 SIMD API는 보통 이 폭을 타입에 드러내서, 코드가 특정 CPU에 묶입니다.
Go 팀은 반대로 갔습니다. 벡터 크기를 타입에서 제거하고 모든 플랫폼에 공통으로 있는 연산만 제공합니다. 타입 이름은 복수형입니다 — simd.Uint8s, simd.Float32s. 하드웨어가 지원하면 네이티브 명령으로, 아니면 에뮬레이션으로 돕니다.
지원 범위
| 아키텍처 | 백엔드 |
|---|---|
| amd64 | AVX, AVX2, AVX512 |
| arm64 | NEON |
| wasm | SIMD 명령 |
| 그 외 | 에뮬레이션 |
연산(Go 1.27 기준): 로드/브로드캐스트, 산술(Add·Mul·MulAdd), 비교, 마스크, 시프트, 로테이트, 재배열, 변환. 없는 것: ReduceSum 같은 축약 연산 — 다음 릴리스에 들어온다고 합니다. SVE(arm64의 가변 길이 벡터)는 Go 1.28 계획입니다.
테스트 편의
GODEBUG=simd=0/128/256/512로 재컴파일 없이 벡터 폭을 바꿔 돌릴 수 있습니다. 내 CPU가 AVX512를 지원하지 않아도 그 경로의 정확성을 확인할 수 있다는 뜻입니다.
성능
"지원되는 하드웨어에서 어셈블리에 가까운 성능"이라고 하지만 글에 구체 수치는 없습니다. 에뮬레이션 경로는 당연히 느립니다.
쓰려면
GOEXPERIMENT=simd로 빌드해야 합니다. 실험 단계라 API가 바뀔 수 있고, 정식 포함 일정은 글에 없습니다. 피드백 창구도 따로 안내돼 있지 않습니다(Go 이슈 트래커를 쓰면 됩니다).
실무에서 할 일
프로덕션에 넣을 단계는 아닙니다. 다만 바이트 단위 스캔, 체크섬, 이미지·오디오 처리처럼 "Go에서 느려서 어셈블리로 짰거나 cgo로 넘겼던" 코드가 있다면 지금 실험 빌드로 돌려보고 Go 팀에 피드백을 주기 좋은 시점입니다. 정식이 되고 나면 설계를 바꾸기 어렵습니다.
2026년 9월 25일에 올라온 글
그날 대시보드 →댓글
불러오는 중…