본문으로 건너뛰기
피드

Go-Highway: Go에서 SIMD 한 번 짜면 AVX2, AVX-512, NEON 다 돌아감

backend 약 5분
vote
0
댓글
북마크

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

  • 1

    Go 1.26+ GOEXPERIMENT=simd 활용, AMD64는 네이티브 archsimd, ARM64는 GoAT 어셈블리

  • 2

    ML용 contrib 패키지 포함: matmul, activation, nn, loss, gguf 등

  • 3

    ARM64 neon:asm 벌크 모드에서 GELU F32 117배, F64 68배 속도 향상

  • 4

    SME(Apple M4+) 전용 행렬곱 하드웨어 지원

  • 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 어셈블리 트랜스파일을 하는데, 이러면 벡터 단위 함수 호출 오버헤드가 사라짐

중요

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

댓글

댓글

댓글을 불러오는 중...

backend

클릭하우스가 PgBouncer 처리량을 4배로 끌어올린 방법

ClickHouse Managed Postgres 팀은 단일 스레드인 PgBouncer를 여러 프로세스로 띄우고 `so_reuseport`와 피어링(peering)을 조합해 16 vCPU 머신을 제대로 쓰게 만들었다. 동일한 AWS 환경에서 단일 프로세스는 약 8.7만 TPS 근처에서 막혔지만, 16개 프로세스 구성은 약 33.6만 TPS까지 올라갔다.

backend

SQLite 쓸 거면 STRICT 테이블을 기본값으로 보자는 주장

SQLite의 STRICT 테이블은 INTEGER 컬럼에 문자열이 들어가는 식의 타입 실수를 막아주는 기능이다. 글쓴이는 SQLite 특유의 유연한 타입 시스템보다, 실수는 빨리 터뜨리는 쪽이 실무에서 낫다고 주장한다. 다만 기존 테이블을 바로 STRICT로 바꾸기 어렵고, SQLite 3.37.0 이상에서만 쓸 수 있다는 제약도 있다.

backend

왜 아직도 Lisp를 배워볼 만한가

Lisp는 괄호가 많은 이상한 언어처럼 보이지만, 핵심은 문법이 아니라 언어 자체를 확장할 수 있다는 점에 있음. 매크로, 코드-데이터 동일성, REPL 중심 개발이 합쳐지면 프로그램을 '작성'한다기보다 살아 있는 시스템을 계속 진화시키는 방식으로 개발하게 됨.

backend

EDB 포스트그레스 AI, 포레스터 멀티모델 데이터 플랫폼 리더 선정

EDB의 AI 데이터 플랫폼 EDB 포스트그레스 AI가 2026년 2분기 포레스터 웨이브 멀티모델 데이터 플랫폼 보고서에서 리더로 선정됐음. 트랜잭션, 분석, AI 워크로드를 하나의 플랫폼에서 다루는 흐름이 강해지는 가운데, EDB는 전략과 현재 제공 기능 모두에서 높은 평가를 받았다고 밝힘.

backend

Bun, Zig에서 Rust로 갈아탔다: 11일짜리 초대형 런타임 포팅 실험

Bun 팀이 53만 줄이 넘는 Zig 코드베이스를 Rust로 기계적으로 포팅했고, Bun v1.4.0부터 Rust 기반으로 전환될 예정임. 핵심 이유는 성능보다 안정성이었고, use-after-free, double-free, 메모리 누수 같은 문제를 컴파일러와 타입 시스템으로 더 빨리 잡기 위해서였음. Claude Code 워크플로 64개를 병렬로 돌려 11일 만에 전 플랫폼 테스트 통과까지 밀어붙인 사례라, LLM 기반 대규모 코드 마이그레이션의 꽤 강한 신호탄임.