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



我正在尝试确定一级缓存(处理器英特尔布罗德韦尔(中加载的缓存行数。 我的内核代码是

a[i] = 2*b[i] + 2.3 // i from 0 to pow(10,8)

我正在使用性能事件L1-dcache-load-misses。测量的数字是预期的两倍。我期待 6M 负载和 6M 商店。但L1-dcache-load-misses约为12M。然而LLC-stores如预期的那样(6M(

i( L1-dcache-load-misses是否同时计算加载和存储未命中?

在英特尔软件开发人员手册(表 19.5(中,对于二级高速缓存,我发现了两个指标

  • 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替代品,这可以解释双重值(存储也会将行提取到L1缓存中(。

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

最新更新