Intel Skylake Xeon处理器上perf stat的LLC-loads数值不一致求助
问题原因分析
这是因为你同时指定的显式事件和-d参数触发了两个底层实现不同但别名相同的LLC-loads统计项,具体原因拆解如下:
-d参数的自动事件逻辑perf stat的-d(--detailed)是预定义的快捷参数,每叠加一次会开启更细粒度的硬件事件集合:- 第一次
-d:添加L1、LLC缓存的基础访问/缺失事件 - 第二次
-d:添加TLB相关事件 - 第三次
-d:添加内存子系统的深层统计事件
其中第一次-d就会自动加入LLC-loads这个统计项,它对应的是Intel Skylake架构上基于缓存硬件访问触发的底层事件(比如LLC_REFERENCES过滤加载操作)。
- 第一次
显式指定的
LLC-loads的底层实现
你手动指定的LLC-loads是perf定义的通用事件别名,在Skylake上默认映射到**基于指令退休(retired)**的底层事件(比如MEM_INST_RETIRED.LOAD_L3_HIT+MEM_INST_RETIRED.LOAD_L3_MISS的总和)。计数逻辑差异导致数值不一致
这两种底层事件的计数逻辑完全不同:- 缓存访问触发的事件:只要LLC收到加载请求就计数,不管这个请求最终是否导致指令退休(比如被分支预测取消的指令对应的LLC访问)
- 指令退休触发的事件:只计数那些最终完成执行、被CPU提交的指令对应的LLC加载操作
这种统计维度的差异直接导致了两个LLC-loads的数值出现偏差,而且这种差异在不同负载下会有不同的表现。
重复事件的显示逻辑
perf会区分不同底层事件的统计项,即使它们的别名相同,所以会在输出中分别显示这两个结果,不会合并。
解决方法
如果你想避免这种重复统计,二选一即可:
- 只保留显式指定的事件,去掉
-d参数 - 去掉手动指定的
LLC-loads等事件,依赖-d参数自动生成的统计项
内容的提问来源于stack exchange,提问作者Nikunj Gupta
相关产品推荐
相关产品推荐

