我有一个特定的软件,它的失误率看起来像这样:
L1-dcache-misses < L2-misses< L3-misses
怎么会这样呢?
未命中率是使用perf
通过查看重新填充计数器除以部分获得每个缓存的总访问次数得出的。
L1-dcache-misses
是all load在一级缓存中丢失的部分。
L2-misses是使所有请求到达L2的请求的一部分(在L1中为miss),在L2中的then未命中。与L3类似。
L1d命中不是L2总访问量的一部分。(这很有意义,因为L2从未看到过它。)>
对于在较小工作集上具有良好局部性的工作负载来说,这是很正常的,但是在L1d中丢失的访问具有时空局部性较差,并且在外部缓存中也往往会丢失。
[此外,如果您使用的是Intel CPU,请注意,它不仅使用mem_load_retired.l1_miss
事件,依此类推;它尝试使用L1D.REPLACEMENT
事件将L1d的same
OFFCORE_RESPONSE
事件,而不是mem_load_retired.l3_hit
/未命中。看到How does Linux perf calculate the cache-references and cache-misses events(同一缓存行的两个负载还没有准备好,它们将共享相同的LFB来跟踪传入的行,因此这种计算是有道理的。同样,如果我们关心的是触摸/丢失的行而不是单个负载。 ]使用L1-dcache-loads
来计算每个负载,因此,即使性能报告的L1命中率也不是[[really