我正在尝试确定在L1缓存(Processor Intel Broadwell)中加载的缓存行数。我的内核代码是
a[i] = 2*b[i] + 2.3 // i from 0 to pow(10,8)
我正在使用perf事件L1-dcache-load-misses
。测得的数量是预期的两倍。我期待6M负载和6M存储。但L1-dcache-load-misses
约为12M。但是LLC-stores
符合预期(6M)
i)L1-dcache-load-misses
是否会计算加载和存储未命中数?
在Intel software developer manual(表19.5)中,对于L2缓存,我找到了两个指标
L2_TRANS.L2_FILL
(r20f0)L2_TRANS.L2_WB
(r40f0)ii)L2_TRANS.L2_FILL的确切含义是什么?它是L2交易的总数吗?
iii)L2_TRANS.L2_WB的确切含义是什么?它是L2写入事务的总数吗?
答案 0 :(得分:1)
Perf使用映射到预定义计数器事件和掩码的这些事件别名,但由于每个CPU可能有不同的映射,这有时会发生变化,并且您可能最终会计算其他内容。
在英特尔论坛上进行的讨论表明,至少有一些系统(Haswell,但Broadwell应该非常相似)L1-dcache-load-misses
错误地映射到L1替换,这可以解释双重值(商店还会将行提取到L1缓存中。
对于L2_trans事件,假设它们被正确映射,它们应该确实计算来自L2的总填充和驱逐。请注意,这可能包括更多的负载+存储,因为L2也有代码(在这么小的内核中可能忽略不计)和预取(可能很重要,因为您的数据在空间布局并且易于预取)。