【发布时间】:2020-05-19 07:06:03
【问题描述】:
我有一个特定的软件表现出这样一种行为,即未命中率如下所示:
L1-dcache-misses < L2-misses< L3-misses
怎么会这样?
未命中率是使用perf 计算的,方法是查看重新填充计数器部分除以每个缓存的访问总数。
【问题讨论】:
我有一个特定的软件表现出这样一种行为,即未命中率如下所示:
L1-dcache-misses < L2-misses< L3-misses
怎么会这样?
未命中率是使用perf 计算的,方法是查看重新填充计数器部分除以每个缓存的访问总数。
【问题讨论】:
L1-dcache-misses 是在 L1d 缓存中未命中的所有加载的一部分。
L2-misses 是完全到达 L2 的请求(在 L1 中未命中)和 然后 在 L2 中未命中的部分。 L3 类似。
L1d 命中不是 L2 访问总数的一部分。(这是有道理的,因为 L2 甚至从未看到它)。
这对于在小型工作集上具有良好局部性的工作负载来说是很正常的,但是在 L1d 中丢失的访问具有较差的时空局部性,并且在外部缓存中也往往会丢失。
L1d 过滤掉所有“简单”的非常高位置的访问,让 L2 和 L3 只处理“较难”的访问。你可以说 L1d 的存在是为了为最小的最热工作集提供出色的延迟(和带宽),而 L2 则试图捕捉从裂缝中掉下来的东西。然后 L3 只会看到访问模式中“最困难”的部分。
另外,如果您使用的是 Intel CPU,请注意 perf 不仅仅使用 mem_load_retired.l1_miss 事件等等;它尝试使用L1D.REPLACEMENT 事件将 L1d 的 same 行的多次未命中计数为单个未命中。 LLC-loads 和 load-misses 使用 OFFCORE_RESPONSE 事件,而不是 mem_load_retired.l3_hit/miss。看
How does Linux perf calculate the cache-references and cache-misses events
(对尚未准备好的同一缓存行的两次加载将共享同一个 LFB 以跟踪传入行,因此这种记帐是有意义的。此外,如果我们关心触摸/错过的行而不是单独的加载。但是 @ 987654328@ 使用 MEM_INST_RETIRED.ALL_LOADS 计算每次加载。因此,即使是性能报告的 L1 命中率也不是真正每条指令的 L1d 加载命中率。对于任何具有空间的程序来说,它都会更高L1d 未命中的局部性。)
【讨论】: