我正在尝试确定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大约为1200万。但是LLC-stores是预期的(6M)

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

Intel software developer manual(表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替换项,这可以解释为double值(存储区也将行提取到L1高速缓存中)。

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

    关于c++ - 测量加载到l1/l2缓存中以进行读取(包括预取)的行数?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42098292/

    10-16 11:55