macOS上的缓存未命中

16
有一些关于这个话题的问题,但没有一个真正的答案。问题是:我如何在macOS上测量L1、L2、L3(如果有的话)缓存未命中? 问题不在于macOS从理论上讲不能提供这些值,即使没有任何外部工具,在Instruments中,我们可以使用计数器并转到录制选项...,就像这里一样:

counters

然而,没有L1缓存未命中或L2,只有可能选择的大量项目列表

events

因此,当测量L1和L2缓存未命中(甚至L3,如果有的话),我该如何计算它们?
在列表中哪个是我应该注意以检索那个神奇的“缓存未命中”数字的"缓存未命中"?

2
这些“事件”的文档是英特尔软件开发手册第3卷第19章 - Iwillnotexist Idonotexist
1
@Rob 我已经擅自编辑了标签,更有可能吸引Peter Cordes、BeeOnRope和其他专家的注意。 - Iwillnotexist Idonotexist
1个回答

18
在Ivy Bridge、Haswell、Broadwell和Goldmont处理器上,可以使用以下事件来计算由可缓存的加载指令所需的数据缓存行数,这些指令未命中L1、L2和L3缓存:MEM_LOAD_UOPS_RETIRED.L1_MISSMEM_LOAD_UOPS_RETIRED.L2_MISSMEM_LOAD_UOPS_RETIRED.L3_MISS。在Skylake及更高版本中,对应的事件称为:MEM_LOAD_RETIRED.L1_MISSMEM_LOAD_RETIRED.L2_MISSMEM_LOAD_RETIRED.L3_MISS。这些事件仅计算已退役的加载指令所需的缓存行。
在Nehalem及更高版本中,可以使用以下事件来计算由可缓存的存储指令所需的缓存行数,这些指令未命中L1、L2和L3缓存:L2_RQSTS.ALL_RFOL2_RQSTS.RFO_MISSOFFCORE_RESPONSE(MSR位1、17、26-29、30-37)。这些事件计算已退役或从管道中刷新的存储指令所需的缓存行。

根据情况,仅计算已退休指令的数量可能比计算所有指令访问次数更有用。不幸的是,没有与 MEM_LOAD_UOPS_* 对应的存储事件。但是,有一些加载事件可以同时计算已退休和刷新的负载。这些包括L1加载缺失的 L2_RQSTS.ALL_DEMAND_DATA_RD ,L2加载缺失的 L2_RQSTS.DEMAND_DATA_RD_MISS 以及L3加载缺失的 OFFCORE_RESPONSE(MSR位0、17、26-29、30-37)。请注意,前两个事件还包括来自L1硬件预取器的负载。 L2_RQSTS.DEMAND_DATA_RD_MISS 事件仅支持Ivy Bridge及更高版本。在Sandy Bridge上,我认为可以通过将 L2_RQSTS.DEMAND_DATA_RD_HIT L2_RQSTS.ALL_DEMAND_DATA_RD 中减去来计算它。

另请参见:Linux perf如何计算缓存引用和缓存未命中事件


脚注:

(1)在Haswell上,“IN”指令被计为“MEM_LOAD_UOPS_RETIRED.L1_MISS”事件(参见:Sandy Bridge上的端口映射I/O是什么样子的)。我还经验证实了所有“MEM_LOAD_UOPS_RETIRED.L1|2|3|LFB_MISS|HIT”事件都不会统计UC或WC内存类型中的负载,而这些事件会统计WP、WB和WT内存类型中的负载。需要注意的是,手册仅提到了UC负载被排除,并且仅适用于某些事件。顺便说一下,“MEM_UOPS_RETIRED.ALL_LOADS”统计了所有内存类型的负载。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接