bor*_*aas 4 c++ performance caching papi perf
PAPI_L1_LDMpapi和L1-dcache-load-missesperf有什么区别?
我使用了相同的设置,例如此处的帖子。
因此,结果我得到了木瓜籽:
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
Run Code Online (Sandbox Code Playgroud)
不幸的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
Run Code Online (Sandbox Code Playgroud)
16,539似乎更合理N=1000000。装入数据丢失(在papi中为PAPI_L1_LDM)和数据缓存未命中(在papi中为PAPI_L1_DCM)之间有什么区别?为什么这些数字在papi和perf中有所不同?是cache-misses:u在PERF有关L2缓存缺失?
编辑:硬件(至强E5-2600 v3系列,Haswell-EP 12核)
一些解释:
从PAPI 手册页中,您可以看到PAPI_L1_LDM=“负载未命中数”。换句话说PAPI_L1_LDM,未命中仅发生于负载(有时是预取)。
加载是指程序执行加载指令以检索内存时。
预取是指进程猜测您将在不久的将来加载内存并提前获取它。
在 L1-dcache-load-misses
L1是1级缓存,是最小和最快的缓存。LLC另一方面,是指高速缓存层次结构的最后一级,因此表示最大但最慢的高速缓存。ivs. d将指令缓存与数据缓存区分开来。这样仅拆分L1,其他高速缓存在数据和指令之间共享。您似乎认为cache-misses:uin性能与L2缓存丢失有关。这实际上是不正确的。
该cache-misses事件表示任何高速缓存无法提供的内存访问次数。
我承认perf的文档资料不是最好的。
但是,通过阅读perf_event_open()函数的文档(假设您已经非常了解CPU和性能监视单元的工作原理,这显然不是计算机体系结构课程),您可以学到很多东西:
例如,通过阅读它,您可以看到cache-missesperf list显示的事件对应于PERF_COUNT_HW_CACHE_MISSES
L1-dcache-load-misses是一个硬件缓存事件,cache-misses也是一个硬件事件(这是“ 硬件缓存事件”的超集)。关于您的差异,您可以咨询此答案,原因是:将阵列的大小增加100或什至是10000,因为它说:“否则,我注意到时序结果的波动很大,长度为1,000,000时,该阵列几乎可以容纳进入您的L3缓存。”