测量 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)中,对于二级缓存,我发现了两个指标
- 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 可能有不同的映射,这有时会发生变化,您可能最终会计算其他东西。
This 英特尔论坛上的讨论表明,至少某些系统(Haswell,但 Broadwell 应该非常相似)L1-dcache-load-misses
错误地映射到 L1 替换,这可以解释双精度值(存储也会将行提取到 L1 缓存中)。
至于 L2_trans 事件,假设它们被正确映射,它们确实应该计算 L2 的总填充和驱逐。请注意,这可能包括更多的加载 + 存储,因为 L2 也有代码(在如此小的内核中可能可以忽略不计)和预取(可能很重要,因为您的数据在空间上布局并且易于预取)。
我正在尝试确定加载到 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)中,对于二级缓存,我发现了两个指标
- 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 可能有不同的映射,这有时会发生变化,您可能最终会计算其他东西。
This 英特尔论坛上的讨论表明,至少某些系统(Haswell,但 Broadwell 应该非常相似)L1-dcache-load-misses
错误地映射到 L1 替换,这可以解释双精度值(存储也会将行提取到 L1 缓存中)。
至于 L2_trans 事件,假设它们被正确映射,它们确实应该计算 L2 的总填充和驱逐。请注意,这可能包括更多的加载 + 存储,因为 L2 也有代码(在如此小的内核中可能可以忽略不计)和预取(可能很重要,因为您的数据在空间上布局并且易于预取)。