关于这个主题有一些问题,但没有一个有真正的答案。问题是:如何在macOS上测量L1,L2,L3(如果有)缓存未命中?
问题不在于,即使没有任何外部工具,macOS在理论上也不会提供这些值。在乐器中,我们可以使用计数器并转到录制选项... ,如下所示:
但是,没有L1缓存未命中或L2,但可以选择的可能项目的大量列表:
因此,当测量L1和L2 缓存未命中(如果有的话,甚至是L3),我如何计算它们?
列表中的哪一个是" 缓存未命中"我应该注意检索那个魔法"缓存未命中"数?
答案 0 :(得分:6)
在Ivy Bridge,Haswell,Broadwell和Goldmont处理器上,您可以使用以下事件来计数错过的可缓存 1 加载指令的需求加载请求所需的数据高速缓存行数L1,L2和L3:分别为MEM_LOAD_UOPS_RETIRED.L1_MISS
,MEM_LOAD_UOPS_RETIRED.L2_MISS
和MEM_LOAD_UOPS_RETIRED.L3_MISS
。在Skylake及更高版本上,相应的事件称为:MEM_LOAD_RETIRED.L1_MISS
,MEM_LOAD_RETIRED.L2_MISS
和MEM_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
会计算所有内存类型的负载。