You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何测量含未退休推测指令的程序执行指令数?含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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 09:35:26