Go 1.27 引入了实验性的 simd 包,为整数和浮点数提供了可移植、与向量宽度无关的 SIMD 类型和运算。一直以来,Gorse 为了加速模型训练和推理中的向量计算,使用 GoAT 将 C 语言编译生成的 SIMD 指令转换为 Go 汇编。simd 包让同一套 Go 代码在不同指令集上运行成为可能,但它的性能能否接近 GoAT 借助 LLVM 生成汇编实现?
2026/8/28大约 8 分钟
Go 1.27 引入了实验性的 simd 包,为整数和浮点数提供了可移植、与向量宽度无关的 SIMD 类型和运算。一直以来,Gorse 为了加速模型训练和推理中的向量计算,使用 GoAT 将 C 语言编译生成的 SIMD 指令转换为 Go 汇编。simd 包让同一套 Go 代码在不同指令集上运行成为可能,但它的性能能否接近 GoAT 借助 LLVM 生成汇编实现?
AVX512是英特尔发布的最新最新一代SIMD指令,能够在一个指令周期内对512位数据进行处理,相当于16个单精度浮点数或者8个双精度浮点数。Gorse推荐系统中的推荐模型训练和推理过程需要大量的向量计算工作,AVX512理论上能够带来一定的加速效果。然而比较遗憾的是,Go语言的编译器并不能自动生成使用SIMD指令的机器码。
MinIO曾经开源过一个将英特尔汇编转换为Go汇编的工具c2goasm。首先,将需要向量化的函数用C语言实现,通过Clang编译出包含SIMD指令的汇编。然后,由于Go汇编是支持AVX512的,将Intel汇编指令转换成Go汇编,即可通过汇编调用SIMD实现的函数。c2goasm的方案十分有效,然而项目已经将近4年没有更新,经过测试也无法处理AVX512指令。