Go 1.27 在标准库中引入了实验性的 simd 包,但大多数文章只介绍 API,很少提及实际性能提升。开发者 Efraín Garay 针对一个具体的向量搜索任务,对比了 Go 的 SIMD 实现与 NumPy 的性能,结果发现关键因素并非语言或库,而是数据是否适合 CPU 缓存。

测试设置

测试任务是一个说话人搜索索引:346,000 个 192 维向量,每次查询需要 6600 万次乘法。测试语料大小为 253 MB,采用单线程运行。

结果:缓存内持平,缓存外落败

当数据完全放入 CPU 缓存时,Go 的 SIMD 性能与 NumPy 相当。但一旦数据超出缓存容量,性能优势消失,甚至可能不如 NumPy。这表明 SIMD 指令本身并非瓶颈,内存带宽和缓存命中率才是决定性能的关键。

对数据密集型应用的影响

对于需要处理大规模向量或矩阵的应用,单纯依赖 SIMD 优化可能不够。开发者需要关注数据布局、缓存友好性以及算法复杂度。Go 的 simd 包为科学计算提供了新工具,但在实际场景中,性能提升取决于数据规模是否适合缓存。

Go 在科学计算领域的潜力

Go 语言在并发和部署方面有优势,但科学计算领域长期被 Python/NumPy 主导。Go 1.27 的 simd 包是一个信号,表明 Go 正在加强数值计算能力。不过,要真正挑战 NumPy,还需要更成熟的生态和更广泛的优化。

对于数据量在缓存范围内的应用,Go 的 SIMD 可以成为 NumPy 的替代方案;对于更大规模的数据,则需要更系统的优化策略。

参考来源