如何测量含未退休推测指令的程序执行指令数?含Intel/AMD方案需求
测量包含推测执行指令的总指令数及替代指标
核心需求
需要统计程序执行时的总指令数(包含未完成退休的推测执行指令),已知perf stat --event instructions -- <my_program>仅能统计已退休指令,需寻找对应实现方式,同时希望获取衡量推测执行量的替代指标,针对Intel Skylake架构,也欢迎其他Intel/AMD处理器方案。
Intel Skylake架构的实现方法
Linux perf没有直接提供统计所有推测执行指令的标准事件,但可以通过硬件原始性能事件实现:
1. 统计解码阶段的所有指令(含推测执行)
Skylake的INST_DECODED.ANY事件会统计被前端解码器处理的所有指令,包括后续被丢弃的推测执行指令。使用命令:
perf stat --event cpu/event=0x00,umask=0x00 <my_program>
注:该事件统计的是解码后的指令,可能和实际进入执行流水线的指令有微小差异,但已接近需求的总指令范围。
2. 统计发射到执行单元的微操作(近似总指令量)
如果需要更贴近执行阶段的统计,可以用UOPS_ISSUED.ANY事件,它会统计所有被发射到执行单元的微操作(包括推测执行的)。对于以简单指令(单微操作)为主的程序,这个数值可以近似总指令数;对于复杂指令,需结合指令拆分比例分析。使用命令:
perf stat --event cpu/event=0x0E,umask=0x01 <my_program>
其他Intel/AMD架构的适配方案
Intel其他架构
- Ice Lake/Sapphire Rapids:可直接复用Skylake的
INST_DECODED.ANY或UOPS_ISSUED.ANY事件,事件编码一致,具体可参考Intel官方《Software Developer Manual》。 - Haswell/Broadwell:使用
INST_DECODED.TOTAL(事件编码0x00,umask=0x00)或UOPS_ISSUED.ALL(事件编码0x0E,umask=0x00)实现类似统计。
AMD架构
- Zen 2/3/4:使用
INST_DECODED事件(编码cpu/event=0x08,umask=0x00)统计解码的所有指令,或UOPS_ISSUED事件(编码cpu/event=0x0C,umask=0x00)统计发射的微操作。具体事件定义可参考AMD《Processor Programming Reference》。
衡量推测执行量的替代指标
如果不需要精确统计总指令数,以下指标可间接衡量推测执行的规模与开销:
- 推测丢弃指令数:用「解码/发射指令数 - 已退休指令数」计算,比如
INST_DECODED.ANY - INST_RETIRED.ANY,差值即为因分支预测错误、机器清除等原因被丢弃的推测执行指令量。 - 分支预测错误数:直接统计
branch-misses事件:
分支预测错误是触发推测执行指令丢弃的最常见原因,该指标可反映推测执行的无效开销。perf stat --event branch-misses <my_program> - 机器清除次数:统计
MACHINE_CLEARS相关事件,比如Skylake的MACHINE_CLEARS.MEMORY_ORDERING(编码cpu/event=0x01,umask=0x04),机器清除会一次性丢弃流水线中所有推测执行的指令,可反映内存序违规、SMC指令等导致的大规模推测丢弃。 - 重排序缓冲区(ROB)压力:统计
rob.full事件(部分架构支持),ROB满会限制推测执行的深度,间接反映推测执行的活跃程度。
内容的提问来源于stack exchange,提问作者Simple.guy
相关产品推荐
相关产品推荐

