Go官方放出平台无关SIMD:一份代码跑遍x86和ARM

来源:互联网 时间:2026-09-26

A5站长网9月26日消息,Go官方博客发布了一篇关于平台无关SIMD的文章。按文章说明,Go1.26和Go1.27已经包含实验性的SIMD接口:Go1.26提供的是amd64上的那一套,Go1.27补上了arm64,具体是NEON指令,以及wasm。这些按架构区分的接口放在archsimd包里,能用,但写一次只能在一个平台上生效。

难点在于平台差异太大。不只是支持的运算不一样,连向量怎么表示都不同:有的平台是固定长度向量,常见128位到512位;有的平台向量长度在构建时并不知道,要等程序启动后才能查出来。所以Go1.27在archsimd之外又加了一层实验性的、可移植且与长度无关的simd接口,思路上参考了C++的Highway。

这层接口的做法是把定长向量从类型系统里拿掉,只保留所有平台交集的运算,交集缺的部分用其他SIMD指令做等价模拟。官方给的目标有四条:覆盖面够支撑多数值得向量化的数据处理算法,源码运算与硬件对得上时性能和汇编相当,对不上的用模拟兜底,另外还要好读好懂。在没有SIMD指令或者archsimd尚未覆盖的平台上,所有运算都走模拟,用simd包写的代码总能跑起来。

类型命名很直白,就是首字母大写、复数形式的基础类型。比较运算产生的是掩码值,宽度与对应向量元素一致,比如8位整数的比较会得到8位掩码。要使用这个实验包,构建时需要设置GOEXPERIMENT里的simd开关;调试时还能用GODEBUG调支持等级,设成0就强制走模拟,设成128、256、512则是按向量长度锁定,方便在不同硬件配置上测同一份代码。

现在仍然很早。Go1.27的simd包里没有跨元素求和的通用做法,求和只能先存回切片再逐项累加,官方说ReduceSum会在下个版本补上。路线图上,Go1.28计划给archsimd加SVE支持并把它补进simd,还会增加OnesCount、掩码运算、归约运算和向量重排等操作,并引入少量特性变体,避免像树莓派这种支持NEON但缺PMULL的平台直接退化成全模拟。

相关文章

标签:

A5创业网 版权所有