用perf和papi测量L1数据缓存未命中

时间:2017-08-03 10:28:59

标签: c++ performance caching perf papi

papi中的PAPI_L1_LDM和性能中的L1-dcache-load-misses之间有什么区别?

我使用了相同的设置,例如this post here

因此,我得到了papi:

PAPI_L1_DCM: 515 <- L1 data cache miss (probably L1D_READ_MISSES_ALL + L1D_READ_MISSES_RETRIED?)
PAPI_L1_ICM: 300 <- L1 Instruction cache miss
PAPI_L1_LDM: 441 <- L1 Load data miss
PAPI_L1_TCM: 815 <- L1 Total cache miss

不幸的是,此计算机不支持PAPI_L1_DCA

对于perf(仅在用户空间,因为papi也只测量用户空间而没有内核空间): 致电:perf stat -B -e L1-dcache-load-misses:u,cache-misses:u ./perf

    16,539      L1-dcache-load-misses
       128      cache-misses:u  

16,539似乎对N=1000000更合理。 load-data-miss(papi中的PAPI_L1_LDM)和数据缓存未命中(papi中的PAPI_L1_DCM)之间有什么区别?为什么这些数字在papi和perf中有所不同? perf中的cache-misses:u是否与L2缓存未命中有关?

编辑:硬件(Xeon E5-2600 v3系列,Haswell-EP 12核心)

1 个答案:

答案 0 :(得分:4)

一些说明:

从PAPI man page,您可以看到PAPI_L1_LDM =“加载失误次数”。换句话说,PAPI_L1_LDM是仅从 加载 (有时 pre-fetches )发生的未命中

加载是程序执行加载指令以检索内存的时间。

预取是指进程猜测您将在不久的将来加载内存并提前获取内存。

L1-dcache-load-misses

  • L1是Level-1缓存,是最小和最快的缓存。另一方面,LLC指的是cache hierarchy的最后一级,因此表示最大但最慢的缓存。
  • id区分指令缓存与数据缓存。只有L1以这种方式分割,其他缓存在数据和指令之间共享。

您似乎认为perf中的cache-misses:u与L2缓存相关 - 未命中。事实并非如此。

cache-misses事件表示任何缓存无法提供的内存访问次数。

我承认perf的文档不是最好的。

然而,人们可以通过阅读(假设你已经很好地了解CPU和性能监视单元如何工作,这显然不是计算机体系结构课程)来学习{{{{{ 3}}功能:

例如,通过阅读,您可以看到perf列表显示的cache-misses事件对应PERF_COUNT_HW_CACHE_MISSES

  • 此外,您可以发现L1-dcache-load-misses 硬件缓存事件 ,而cache-misses 硬件事件 (这是硬件缓存事件的超级集合)。

关于你的不同,你可以参考perf_event_open()回答,原因是你的阵列大小增加了100倍甚至10000,因为它说“我发现时间结果有很大的波动否则长度为1,000,000,阵列几乎完全适合您的L3缓存。“