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

Measure the number of lines loaded in l1/l2 cache for reads(including prefetch)?

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

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

我正在使用 perf 事件 L1-dcache-load-misses。测得的数字是预期的两倍。我期待 600 万负载和 600 万商店。但是L1-dcache-load-misses就是12M左右。然而 LLC-stores 符合预期 (6M)

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

Intel software developer manual (table 19.5)中,对于二级缓存,我发现了两个指标

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

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

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

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

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