amd64 微架构级别对 Go 性能影响几何?v2、v3 显著,v4 待优化
amd64 微架构级别提升 Go 性能:v2、v3 显著,v4 有待优化?
Daniel Lemire 是一位软件性能专家,在全球科学家中排名前 2%(斯坦福大学/爱思唯尔 2025 年排名),也是 GitHub 上最受关注的前 1000 名开发者之一。其博客 Daniel Lemire 的博客 创办于 2004 年,目前已有 2371 篇文章和 16298 条审核通过的评论,且在领先的科技新闻聚合平台 Hacker News 上排名前 50。
菜单与业务
博客提供了相关链接,包括 我的主页、GitHub 个人资料。若企业需要帮助,可联系 Daniel Lemire,他提供 私人讲座、培训、咨询服务,也承接赞助的开源项目。同时,他不接受任何广告,但读者可以 在 GitHub 上赞助他的开源工作。
关注与订阅
读者可以加入超过 12500 名邮件订阅者的行列,也能在 GitHub 上关注、在 X 上关注 @lemire (超过 30000 名关注者),还能在 Telegram 上关注这个博客。
近期文章
- amd64 微架构级别对 Go 有多大帮助?
- 具身认知与能动 AI
- 使用 AVX - 512 极快地解析 IPv6 地址
- 所有 64 位整数中只有 17% 是两个 32 位整数的乘积
- SIMD 加速的整数转字符串转换
近期评论
- Xarn 评论 amd64 微架构级别对 Go 有多大帮助?
- Steve Z 评论 具身认知与能动 AI
- Haruto Kobayashi 评论 计算 64 位整数的位数
- Nik 评论 所有 64 位整数中只有 17% 是两个 32 位整数的乘积
- Daniel Lemire 评论 你可以击败二分查找
页面导航
博客还提供了多个页面链接,如 技术简史、关于我、书籍推荐 等。
文章存档
可按月份选择文章存档,如 2026 年 6 月(1 篇)、2026 年 5 月(6 篇)等,涵盖了从 2004 年到 2026 年各月的文章数量信息。
其他信息
包含 登录、文章订阅源、评论订阅源、WordPress 官网 等链接。
amd64 微架构级别对 Go 有多大帮助?
64 位英特尔和 AMD 处理器已发展数十年。为 64 位英特尔或 AMD 处理器编译 Go 程序时,编译器默认针对近 20 年前的指令集,生成的二进制文件虽能在任何 x64 芯片上运行,但错过了 2003 年以来添加的所有指令。
通常提到的 “微架构级别”,每个级别包含一组可假定存在的指令集扩展:
| 级别 | 大致新增内容 |
|---|---|
| v1 | 原始的 AMD64 基线(SSE2) |
| v2 | `popcnt`、SSE4.2 |
| v3 | AVX2 |
| v4 | AVX - 512(F/BW/DQ/VL) |
该分级体系约在 2020 年固定,如今硬件不断发展,需要添加最新的 AVX - 512 子扩展(VBMI、VBMI2、VNNI、BF16、FP16、VPOPCNTDQ 等),这些扩展服务器和消费级芯片都支持,但 `v4` 并不包含。虽然 `v1` 到 `v4` 是有用的通用标准,但要充分利用 CPU 所有功能,至少需要 `v5` 级别,甚至整个分级体系应被更细粒度的特性检测取代。
Go 工具链通过 [`GOAMD64`] 环境变量暴露了 `v1` 到 `v4` 分级体系。设置 `GOAMD64=v3` 可让编译器使用包括 AVX2 在内的所有指令,默认值是 `v1`,即最低通用标准。
为探究不同级别对性能的影响,Daniel Lemire 选择了 Roaring Bitmaps 这个用于数据库和搜索引擎的压缩位集数据结构。Roaring Bitmap 存储 32 位整数,将 32 位空间划分为 65536 个值的块,以高 16 位为键,每个块存储在只保存低 16 位的“容器”中,容器有数组容器、位图容器、游程容器三种类型,库会选择最小的那种。
他获取该库最新版本,在 Go 1.26.2 和 Roaring v2.18.2 环境下,于英特尔至强金牌 6548N(Emerald Rapids,支持包括 AVX - 512 在内的所有四个级别)上,对其自带基准测试套件进行四次运行,每个级别运行一次,每次收集八个样本。
“人口计数”(或 `popcount`,也称为汉明重量)指机器字中设置为 1 的位数,Roaring 经常用到。现代 x86 芯片有专门的 `popcnt` 指令,但该指令直到 `v2` 级别(SSE4.2,2008 年)才可用,若没有它,编译器需用多指令的位操作序列替代。
在人口计数方面,`v1` 级别无法使用 `popcnt` 指令,Go 采用软件回退方案,升级到 `v2` 后,`popcnt` 指令可用,时间几乎缩短一半,性能提升 43%,且无需更改源代码,只需设置编译器标志。不过 `v3` 和 `v4` 未带来更多提升,单个 `popcnt` 指令已是最优,AVX2 和 AVX - 512 对 Go 编译器无额外作用。
从密集位图构建容器时,`FromDense array` 基准测试会获取 8 KB 位向量并构建最紧凑容器,涉及人口计数和扫描设置位位置。当 256 位寄存器可用时,编译器可对循环进行自动向量化,`v2` 之后性能持续提升。`v2` 通过使用标量 `popcnt`/`tzcnt` 指令将时间缩短 21%,`v3`(AVX2)将提升幅度翻倍至 38%,`v4` 无额外提升。
集合操作中,`IntersectionCardinality` 基准测试计算两个位图交集元素数量,`v2` 作用不大,`v3` 让编译器将按位与和计数循环扩展到 256 位寄存器,时间缩短 22%。
总结如下:
- 在现代硬件上,应使用 `v2` 或更高级别,生成的二进制文件可在数据中心和非老旧笔记本电脑上运行。
- `v3` 级别值得进一步研究。
- 部分基准测试中,`v4` 级别本应有用但实际未起作用,怀疑是 Go 编译器表现不佳。
当然,用户应自己进行基准测试。
文章信息
本文《amd64 微架构级别对 Go 有多大帮助?》由 Daniel Lemire 发表于 _Daniel Lemire 的博客_,2026 年 6 月 6 日,https://lemire.me/blog/2026/06/06/how-much-do-amd64-microarchitecture-levels-help-in-go/。
作者信息
Daniel Lemire 是魁北克大学(TELUQ)的计算机科学教授,可 查看 Daniel Lemire 的所有文章。文章发表于 2026 年 6 月 6 日,作者 Daniel Lemire,分类 []。
评论信息
有读者 Xarn 于 2026 年 6 月 8 日下午 4:40 评论,提到从文档来看,“Go 工具链目前不会生成任何 AVX512 指令”,并可 回复。
评论回复
若想发表回复,需填写评论、姓名、电子邮件等信息,电子邮件地址不会公开。还可 通过电子邮件订阅 该博客(非商业性质,无广告,每周发送邮件),发布代码可考虑使用 tohtml 等工具格式化。
文章导航
上一篇文章是 具身认知与能动 AI,同时可查看 使用条款。
