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
。这些事件仅计算已退役的加载指令所需的缓存行。L2_RQSTS.ALL_RFO
、L2_RQSTS.RFO_MISS
和OFFCORE_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
”统计了所有内存类型的负载。