30 秒看懂
Matt Godbolt 介绍乱序执行、分支预测、寄存器重命名和内存行为。他通过布隆过滤器和链表示例演示如何检查瓶颈,并强调真实工作负载的基准测试。
- 1流水线独立指令可以乱序执行,同时按程序顺序退休。
- 2分支预测预测保持流水线供给,但猜错会浪费工作。
- 3寄存器重命名重命名消除部分寄存器假依赖。
- 4可预测性输入顺序可以影响分支行为。
- 5布隆过滤器布隆过滤器允许假阳性,但能排除不存在的值。
- 6模拟将 llvm-mca 当作模型,并对真实工作负载做基准测试。
- 7内存内存布局和指针依赖可能主导性能。
要点建议
- 独立指令可以乱序执行,同时按程序顺序退休。
- 预测保持流水线供给,但猜错会浪费工作。
- 重命名消除部分寄存器假依赖。
- 输入顺序可以影响分支行为。
- 布隆过滤器允许假阳性,但能排除不存在的值。
- 将 llvm-mca 当作模型,并对真实工作负载做基准测试。
- 内存布局和指针依赖可能主导性能。
按章节阅读整理后的全文
CPU 流水线
乱序执行与退休。
在 2024 年 GOTO Chicago 大会上,Matt Godbolt 用简化模型介绍现代 CPU 流水线、分支预测和内存,并主要使用 x86 示例。他建议测量真实工作负载,而不是只依靠直觉或模拟器。
前端获取并解码指令;执行机制可以在满足依赖关系的情况下乱序运行相互独立的操作。在这一简化模型中,指令按程序顺序退休提交,即使执行顺序发生了变化。
分支预测器提前猜测控制流,让长流水线持续获得工作。预测正确可避免浪费;预测错误时,处理器需要丢弃推测执行的工作并从正确路径重新开始。
寄存器重命名减少反复使用架构寄存器造成的假依赖。当输入和资源可用时,多个执行单元可以并行工作。
分支预测
历史信息与数据顺序实验。
Godbolt 概述预测器如何使用分支位置和历史信息。他比较对随机数据和相同排序数据的循环,说明可预测的控制流即使经过语言解释器也可能影响运行时间。
分析执行
布隆过滤器、除法与编译器。
布隆过滤器示例介绍概率性集合测试:它可以判断肯定不存在或可能存在,允许假阳性。Godbolt 用该例检查执行流水线中操作的成本。
他在 Compiler Explorer 中使用 llvm-mca 模拟指令调度。在他的示例中,动态取模可能导致成本较高的除法;选择二的幂作为表大小可以使用掩码,但这一选择可能影响哈希行为,必须结合应用评估。
编译器可能将除以已知常量替换为乘法和移位序列。细节取决于编译器、目标平台和数据类型,因此修改前应检查生成的代码并做基准测试。
内存与测量
缓存行为与 perf。
内存访问与缓存行为可能主导运行时间。在他的链表示例中,顺序布局比随机指针快得多,因为访问模式、依赖关系和预取方式不同。数字描述的是他的测试,而非所有机器。
最后他介绍自顶向下性能分析和 perf 计数器,用来区分前端、推测执行、执行单元和内存瓶颈。演讲聚焦单核,多核一致性和 SIMD 留待进一步学习。
同频道的其他文章
40:04EN → 简体中文
51:06EN → 简体中文
20:04EN → 简体中文
39:12EN → 简体中文
22:33EN → 简体中文
34:11EN → 简体中文