缓存未命中macOS

时间:2018-02-01 15:55:56

标签: performance caching x86 performancecounter xcode-instruments

关于这个主题有一些问题,但没有一个有真正的答案。问题是:如何在macOS上测量L1,L2,L3(如果有)缓存未命中

问题不在于,即使没有任何外部工具,macOS在理论上也不会提供这些值。在乐器中,我们可以使用计数器并转到录制选项... ,如下所示:

counters

但是,没有L1缓存未命中或L2,但可以选择的可能项目的大量列表:

events

因此,当测量L1和L2 缓存未命中(如果有的话,甚至是L3),我如何计算它们?

列表中的哪一个是" 缓存未命中"我应该注意检索那个魔法"缓存未命中"数?

1 个答案:

答案 0 :(得分:6)

在Ivy Bridge,Haswell,Broadwell和Goldmont处理器上,您可以使用以下事件来计数错过的可缓存 1 加载指令的需求加载请求所需的数据高速缓存行数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_RFO,{{ 1}}和L2_RQSTS.RFO_MISS(MSR位1、17、26-29、30-37)。这些事件计算从管道中退出或清除的存储指令所需的缓存行。

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

另请参阅:How does Linux perf calculate the cache-references and cache-misses events


脚注:

(1)L2_RQSTS.ALL_DEMAND_DATA_RD指令被视为Haswell上的IN事件(请参见:What does port-mapped I/O look like on Sandy Bridge)。我还凭经验验证了所有MEM_LOAD_UOPS_RETIRED.L1_MISS事件都不计算UC或WC内存类型的负载,它们确实计算WP,WB和WT内存类型的负载。请注意,手册仅提及UC负载被排除,并且仅针对某些事件。顺便说一下,MEM_LOAD_UOPS_RETIRED.L1|2|3|LFB_MISS|HIT会计算所有内存类型的负载。