amd64 微架构级别对 Go 性能影响几何?v2、v3 显著,v4 待优化

发布时间:2026/6/9 20:25:15

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 评论 具身认知与能动 AIHaruto 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 基线SSE2v2popcnt、SSE4.2v3AVX2v4AVX - 512F/BW/DQ/VL该分级体系约在 2020 年固定如今硬件不断发展需要添加最新的 AVX - 512 子扩展VBMI、VBMI2、VNNI、BF16、FP16、VPOPCNTDQ 等这些扩展服务器和消费级芯片都支持但 v4 并不包含。虽然 v1 到 v4 是有用的通用标准但要充分利用 CPU 所有功能至少需要 v5 级别甚至整个分级体系应被更细粒度的特性检测取代。Go 工具链通过 [GOAMD64] 环境变量暴露了 v1 到 v4 分级体系。设置 GOAMD64v3 可让编译器使用包括 AVX2 在内的所有指令默认值是 v1即最低通用标准。为探究不同级别对性能的影响Daniel Lemire 选择了 Roaring Bitmaps 这个用于数据库和搜索引擎的压缩位集数据结构。Roaring Bitmap 存储 32 位整数将 32 位空间划分为 65536 个值的块以高 16 位为键每个块存储在只保存低 16 位的“容器”中容器有数组容器、位图容器、游程容器三种类型库会选择最小的那种。他获取该库最新版本在 Go 1.26.2 和 Roaring v2.18.2 环境下于英特尔至强金牌 6548NEmerald Rapids支持包括 AVX - 512 在内的所有四个级别上对其自带基准测试套件进行四次运行每个级别运行一次每次收集八个样本。“人口计数”或 popcount也称为汉明重量指机器字中设置为 1 的位数Roaring 经常用到。现代 x86 芯片有专门的 popcnt 指令但该指令直到 v2 级别SSE4.22008 年才可用若没有它编译器需用多指令的位操作序列替代。在人口计数方面v1 级别无法使用 popcnt 指令Go 采用软件回退方案升级到 v2 后popcnt 指令可用时间几乎缩短一半性能提升 43%且无需更改源代码只需设置编译器标志。不过 v3 和 v4 未带来更多提升单个 popcnt 指令已是最优AVX2 和 AVX - 512 对 Go 编译器无额外作用。从密集位图构建容器时FromDense array 基准测试会获取 8 KB 位向量并构建最紧凑容器涉及人口计数和扫描设置位位置。当 256 位寄存器可用时编译器可对循环进行自动向量化v2 之后性能持续提升。v2 通过使用标量 popcnt/tzcnt 指令将时间缩短 21%v3AVX2将提升幅度翻倍至 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同时可查看 使用条款。

相关新闻