macOS 上的缓存未命中

Cache misses on macOS

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

问题不在于 macOS 在理论上即使没有任何外部工具也不提供这些值。在 Instruments 中,我们可以使用 Counters 并转到 Recording Options...,如下所示:

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

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

列表中的哪一个是“缓存未命中”我应该注意以检索那个神奇的 "cache miss" 数字?

在 Ivy Bridge、Haswell、Broadwell 和 Goldmont 处理器上,您可以使用以下事件来计算来自 cacheable1[=46= 的按需加载请求所需的数据缓存行数] 加载错过 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 bits 0, 17, 26-29, 30-37)。请注意,前两个事件还包括来自 L1 硬件预取器的加载。 L2_RQSTS.DEMAND_DATA_RD_MISS 事件仅在 Ivy Bridge 及更高版本上受支持。在Sandy Bridge上,我认为可以通过L2_RQSTS.ALL_DEMAND_DATA_RD减去L2_RQSTS.DEMAND_DATA_RD_HIT来计算。

另见:.


脚注:

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