测量l1 / l2缓存中加载的行数(包括预取)?

时间:2017-02-07 19:28:00

标签: c++ linux caching cpu-architecture perf

我正在尝试确定在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缓存,我找到了两个指标

  • i)L2_TRANS.L2_FILL(r20f0)
  • ii)L2_TRANS.L2_WB(r40f0)

ii)L2_TRANS.L2_FILL的确切含义是什么?它是L2交易的总数吗?

iii)L2_TRANS.L2_WB的确切含义是什么?它是L2写入事务的总数吗?

1 个答案:

答案 0 :(得分:1)

Perf使用映射到预定义计数器事件和掩码的这些事件别名,但由于每个CPU可能有不同的映射,这有时会发生变化,并且您可能最终会计算其他内容。

在英特尔论坛上进行的讨论表明,至少有一些系统(Haswell,但Broadwell应该非常相似)L1-dcache-load-misses错误地映射到L1替换,这可以解释双重值(商店还会将行提取到L1缓存中。

对于L2_trans事件,假设它们被正确映射,它们应该确实计算来自L2的总填充和驱逐。请注意,这可能包括更多的负载+存储,因为L2也有代码(在这么小的内核中可能忽略不计)和预取(可能很重要,因为您的数据在空间布局并且易于预取)。