测量读取(包括预取)读取在l1 / l2caching中加载的行数?

我正在尝试确定L1caching(Intel Broadwell处理器)中加载的caching行数。 我的内核代码是

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正如预期的那样(6百万)

i) L1-dcache-load-misses是否包括加载和存储缺失?

在英特尔软件开发人员手册 (表19.5)中,对于二级caching,我find了两个指标

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

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

iii)L2_TRANS.L2_WB的确切含义是什么? 这是L2写交易的总数吗?

Perf使用映射到预定义计数器事件和掩码的这些事件别名,但是由于每个CPU可能有不同的映射,所以这有时会转移,最终可能会计算其他值。

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

至于L2_trans事件,假设他们正确映射,他们应该确实计算L2的总填充和驱逐。 请注意,这可能包括更多的负载+商店,因为L2也有代码(在这样一个小内核中可能忽略不计),以及预取(可能是重要的,因为您的数据空间布局易于预取)。