Caching 用于缓存引用的Linux perf命令

Caching 用于缓存引用的Linux perf命令,caching,rate,perf,Caching,Rate,Perf,我想测量代码的缓存未命中率。我们可以使用perf list来显示支持的事件。我的桌面有一个Intel(R)Core(TM)i5-2400 CPU@3.10GHz处理器,性能列表包含缓存引用和缓存未命中,如下所示: cpu-cycles OR cycles [Hardware event] stalled-cycles-frontend OR idle-cycles-frontend [Hardware event] s

我想测量代码的缓存未命中率。我们可以使用perf list来显示支持的事件。我的桌面有一个Intel(R)Core(TM)i5-2400 CPU@3.10GHz处理器,性能列表包含缓存引用和缓存未命中,如下所示:

  cpu-cycles OR cycles                               [Hardware event]
  stalled-cycles-frontend OR idle-cycles-frontend    [Hardware event]
  stalled-cycles-backend OR idle-cycles-backend      [Hardware event]
  instructions                                       [Hardware event]
  cache-references                                   [Hardware event]
  cache-misses                                       [Hardware event]

我认为,根据《英特尔体系结构软件开发人员手册》,缓存未命中映射为硬件事件LLC未命中(我通过比较perf stat-e r412eperf stat-e缓存未命中来确认这一点,它们给出了几乎相同的结果)。但是缓存引用是如何计算的呢?我没有找到使用现有硬件事件获取总缓存引用的事件或方法。所以我想知道这个缓存引用在我的计算机上是否准确

如果您查看内核代码中的arch/x86/kernel/cpu/perf_event_intel.c。你会看到的

"PERF_COUNT_HW_CACHE_REFERENCES = 0x4f2e". 
何处为

"PERF_COUNT_HW_CACHE_MISSES= 0x412e"

X86体系结构手册说0x4f2e是“此事件统计来自引用最后一级缓存中缓存线的核心的请求”。因此,我假设它是正确的。

我尝试了一个来自英特尔的名为Vtune的工具,我得到了一些关于如何测量总缓存引用的线索。它们可以测量微操作代码,并过滤加载或存储的指令,以获得总缓存引用。但我不确定perf工具是否也使用此方法。

在英特尔,我不认为
perf
提供了一个事件来测量总缓存引用,因为这样的事件在硬件级别不存在。您应该能够使用
perf list
报告的硬件缓存事件自己计算此信息:

L1-dcache-loads                                    [Hardware cache event]
L1-dcache-load-misses                              [Hardware cache event]
L1-dcache-stores                                   [Hardware cache event]
L1-dcache-store-misses                             [Hardware cache event]
L1-dcache-prefetches                               [Hardware cache event]
L1-dcache-prefetch-misses                          [Hardware cache event]
L1-icache-loads                                    [Hardware cache event]
L1-icache-load-misses                              [Hardware cache event]
L1-icache-prefetches                               [Hardware cache event]
L1-icache-prefetch-misses                          [Hardware cache event]
LLC-loads                                          [Hardware cache event]
LLC-load-misses                                    [Hardware cache event]
LLC-stores                                         [Hardware cache event]
LLC-store-misses                                   [Hardware cache event]
LLC-prefetches                                     [Hardware cache event]
LLC-prefetch-misses                                [Hardware cache event]
未标记有
-未命中
的事件表示关联缓存中的引用数


注意:此“上一个”和“关于性能事件”的“打开”(perf内部使用)可能会有所帮助。

我在“缓存未命中”下面看到缓存引用。什么是小时精确问题?我的意思是,虽然给了您缓存引用,但我想知道它是如何计算的,它准确吗?我在“英特尔手册”中未找到缓存引用的事件计数器。是。这两个事件是英特尔处理器中的体系结构性能事件。0x4f2e是LLC引用,称为最长延迟缓存引用;0x412e是LLC未命中,称为最长缓存未命中。我是从这本手册上得到的。然而,我认为LLC引用只是命中LLC的内存访问,而不包括L1和L2中的缓存命中。所以它并不准确。所以0x4f2e只是命中LLC的缓存引用,但不包括命中L1和L2的缓存引用。pmu工具中的ocperf.py能够通过符号名在英特尔上使用任何事件(该脚本只编程
perf
工具);包含了几个有用的脚本。并非来自
perf list
的所有事件都可以映射到硬件性能计数器。。。