Hacker NewsAI · 머신러닝오늘의 주요

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처럼 일부 기능만 미지원한 플랫폼용 기능 변형 추가.
AI 요약 안내

AI가 한국어로 정리한 내용입니다. 정확한 정보는 원문을 확인해 주세요.

요약 원칙 ↗