用于缓存引用的 Linux perf 命令

Posted

技术标签:

【中文标题】用于缓存引用的 Linux perf 命令【英文标题】:Linux perf command for cache references 【发布时间】:2014-07-28 09:47:09 【问题描述】:

我想测量我的代码的缓存未命中率。我们可以使用 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-misses(我通过比较 perf stat -e r412eperf stat -e 来确认这一点缓存未命中,他们给出了几乎相同的结果)。但是缓存引用是如何计算的呢?我没有找到使用现有硬件事件获取总缓存引用的事件或方法。所以我想知道这个缓存引用在我的计算机上是否准确?

【问题讨论】:

我在缓存未命中下方看到缓存引用。什么是小时精确问题? 我的意思是虽然给你缓存引用,但我想知道它是如何计算的,它准确吗?我没有在英特尔手册中找到缓存引用的事件计数器。 【参考方案1】:

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

"PERF_COUNT_HW_CACHE_REFERENCES = 0x4f2e". 

在哪里

"PERF_COUNT_HW_CACHE_MISSES= 0x412e"

X86 架构手册说 0x4f2e 是“此事件计算源自内核的请求,这些请求引用最后一级缓存中的缓存行”。所以我认为它是正确的。

【讨论】:

是的。这两个事件是英特尔处理器中的架构性能事件。 0x4f2e 是 LLC 引用,被描述为 最长延迟缓存引用,0x412e 是 LLC 未命中,被描述为 最长缓存未命中。我从本手册Intel manual 中得到这个。但是我认为 LLC 引用只是命中 LLC 的内存访问,而不包括 L1 和 L2 中的缓存命中。所以不准确。 所以 0x4f2e 只是命中 LLC 的缓存引用,但不包括命中 L1 和 L2 的缓存引用。【参考方案2】:

在 Intel 上,我不认为 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]

未用-misses 标记的事件表示关联缓存中的引用数。

注意:以前的 question 和 man page 关于 perf_event_open(由 perf 内部使用)可能会有所帮助。

【讨论】:

并非所有来自perf list 的事件都可以映射到硬件性能计数器...【参考方案3】:

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

【讨论】:

ocperf.py 来自 pmu-tools github.com/andikleen/pmu-tools 能够通过符号名称使用 Intel 上的任何事件(该脚本仅对 perf 工具进行编程);包括几个有用的脚本

以上是关于用于缓存引用的 Linux perf 命令的主要内容,如果未能解决你的问题,请参考以下文章

linux perf 是不是准确测量多线程 C 程序的缓存未命中?

用于测量 Linux 中 NUMA 节点缓存未命中/命中的工具?

perf中的硬件事件和硬件缓存事件有啥区别?

perf 缓存事件是啥意思?

为啥 perf 不报告缓存未命中?

我不了解 cachegrind 与 perf 工具之间的缓存未命中计数