Platform-Independent SIMD in Go
10 hours ago
- Go 1.26 和 1.27 引入了实验性的 SIMD API,最初支持 amd64,随后扩展到 arm64 和 wasm。
- 一个新的便携式 simd 包提供了与平台无关的 SIMD 操作接口,基于 C++ 的 Highway 库。
- simd 包抽象了不同架构间的向量大小、掩码和操作差异,并为不支持的平台提供模拟。
- 支持的架构包括 amd64(AVX、AVX2、AVX512)、arm64(NEON)和 wasm,其他架构通过模拟运行。
- 向量类型以 simd.Float32s 命名,操作包括加载/存储、算术、比较、转换等。
- 通过 GODEBUG 设置(simd=0,128,256,512)可以测试不同的 SIMD 级别或模拟模式。
- 实现使用编译器中的 AST 重写技术,为每种向量长度生成专门的副本。
- 未来计划包括添加 SVE 支持、更多操作(如 OnesCount、归约)以及功能变体。