现代 CPU 如何执行代码:流水线、分支与内存

原标题How Modern CPUs Execute Code: Pipelines, Branches and Memory

Matt Godbolt 介绍常见性能机制和测量工具。

MGMatt Godbolt讲者
频道
GOTO Conferences
发布
2025年4月16日
视频
43:28
阅读
2 分钟
原文
英语
在 YouTube 打开
往下滚动阅读时,视频会缩到右下角继续播放。字幕跟随阅读语言。
阅读语言共 2 种语言可读
由 AI 从英语原文翻译。打开“对照原文”可以逐段核对。
摘要

30 秒看懂

Matt Godbolt 介绍乱序执行、分支预测、寄存器重命名和内存行为。他通过布隆过滤器和链表示例演示如何检查瓶颈,并强调真实工作负载的基准测试。

  1. 1流水线独立指令可以乱序执行,同时按程序顺序退休。
  2. 2分支预测预测保持流水线供给,但猜错会浪费工作。
  3. 3寄存器重命名重命名消除部分寄存器假依赖。
  4. 4可预测性输入顺序可以影响分支行为。
  5. 5布隆过滤器布隆过滤器允许假阳性,但能排除不存在的值。
  6. 6模拟将 llvm-mca 当作模型,并对真实工作负载做基准测试。
  7. 7内存内存布局和指针依赖可能主导性能。

要点建议

  1. 独立指令可以乱序执行,同时按程序顺序退休。
  2. 预测保持流水线供给,但猜错会浪费工作。
  3. 重命名消除部分寄存器假依赖。
  4. 输入顺序可以影响分支行为。
  5. 布隆过滤器允许假阳性,但能排除不存在的值。
  6. 将 llvm-mca 当作模型,并对真实工作负载做基准测试。
  7. 内存布局和指针依赖可能主导性能。
全文

按章节阅读整理后的全文

只看原始文稿
01

CPU 流水线

乱序执行与退休。

在 2024 年 GOTO Chicago 大会上,Matt Godbolt 用简化模型介绍现代 CPU 流水线、分支预测和内存,并主要使用 x86 示例。他建议测量真实工作负载,而不是只依靠直觉或模拟器。

前端获取并解码指令;执行机制可以在满足依赖关系的情况下乱序运行相互独立的操作。在这一简化模型中,指令按程序顺序退休提交,即使执行顺序发生了变化。

分支预测器提前猜测控制流,让长流水线持续获得工作。预测正确可避免浪费;预测错误时,处理器需要丢弃推测执行的工作并从正确路径重新开始。

寄存器重命名减少反复使用架构寄存器造成的假依赖。当输入和资源可用时,多个执行单元可以并行工作。

02

分支预测

历史信息与数据顺序实验。

Godbolt 概述预测器如何使用分支位置和历史信息。他比较对随机数据和相同排序数据的循环,说明可预测的控制流即使经过语言解释器也可能影响运行时间。

03

分析执行

布隆过滤器、除法与编译器。

布隆过滤器示例介绍概率性集合测试:它可以判断肯定不存在或可能存在,允许假阳性。Godbolt 用该例检查执行流水线中操作的成本。

他在 Compiler Explorer 中使用 llvm-mca 模拟指令调度。在他的示例中,动态取模可能导致成本较高的除法;选择二的幂作为表大小可以使用掩码,但这一选择可能影响哈希行为,必须结合应用评估。

编译器可能将除以已知常量替换为乘法和移位序列。细节取决于编译器、目标平台和数据类型,因此修改前应检查生成的代码并做基准测试。

04

内存与测量

缓存行为与 perf。

内存访问与缓存行为可能主导运行时间。在他的链表示例中,顺序布局比随机指针快得多,因为访问模式、依赖关系和预取方式不同。数字描述的是他的测试,而非所有机器。

最后他介绍自顶向下性能分析和 perf 计数器,用来区分前端、推测执行、执行单元和内存瓶颈。演讲聚焦单核,多核一致性和 SIMD 留待进一步学习。

同频道的其他文章

7 张幻灯片40:04EN → 简体中文
GOTO Conferences· 2026年11月2日Sophia Drossopoulou:如何在开放世界中验证可信代码Sophia Drossopoulou · Imperial College London当可信代码调用未知对象时,能力、有作用域不变量和明确的信任假设有助于推理其影响。Code review & verificationProgramming LanguagesSoftware engineering
4 张幻灯片51:06EN → 简体中文
GOTO Conferences· 2026年11月2日Kent Beck:为人的需求构建 AI 编程工具Kent Beck“精灵”会放大健康或不健康的开发实践。Beck 呼吁工具保留学习、连接与未来选择。编程智能体Software engineeringDeveloper productivity+1
4 张幻灯片20:04EN → 简体中文
GOTO Conferences· 2026年10月30日Somtochi Onyekwere:将协议逻辑与 I/O 分离,实现确定性测试Somtochi Onyekwere · Fly.ioSans I/O 设计让本地模拟器可以使用虚拟时间和受控故障运行数千个协议状态。开发流程与测试Software engineering
3 张幻灯片39:12EN → 简体中文
GOTO Conferences· 2026年10月28日Cate Huston:严谨如何支撑 AI 辅助开发的交付速度Cate Huston · Twill两人团队分享发布关口、自动检查、优先级和加快交付的成本。AI 工程管理Software engineeringAI agents
4 张幻灯片22:33EN → 简体中文
GOTO Conferences· 2026年10月26日William Schor:Netflix 如何从单元测试走向合成金丝雀William Schor · Netflix用生成的工作负载和接近生产的基础设施,测试分布式键值服务。Software engineering
5 张幻灯片34:11EN → 简体中文
GOTO Conferences· 2026年10月23日Anatoliy Bilenko 和 Alberto Carretero:用形式化方法和 AI 让数据库协议可靠Anatoliy Bilenko, Alberto Carretero · CanonicalCanonical 的数据库工程师把可执行规格、基于模型的测试、故障探索和重建的执行历史串起来,并说明为什么这些方法单独用,都无法证明真实系统正确。开发流程与测试Code review & verification可观测性与可靠性+2