Linux性能命令perf用于缓存引用

5

我想测量我的代码缓存未命中率。我们可以使用perf list来显示支持的事件。我的台式机有一个Intel(R) Core(TM) i5-2400 CPU @ 3.10GHz处理器,perf list包含了cache-references和cache-misses等内容:

  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 cache-misses 得出这个结论,它们的结果几乎相同)。但是缓存引用如何计数?我没有找到一个事件或方法来获取使用现有硬件事件的总缓存引用。所以我想知道这个缓存引用在我的电脑上是否准确?


我看到缓存未命中下面刚好是缓存引用。你的确切问题是什么? - Milind Dumbare
我的意思是,尽管你已经得到了缓存引用,但我想知道它是如何计算的,是否准确?在英特尔手册中,我没有找到关于缓存引用的事件计数器。 - Robert
3个回答

6
如果您查看内核代码中的arch/x86/kernel/cpu/perf_event_intel.c文件,您会发现:
"PERF_COUNT_HW_CACHE_REFERENCES = 0x4f2e". 

相比之下

"PERF_COUNT_HW_CACHE_MISSES= 0x412e"

X86架构手册表示0x4f2e是“此事件计算源自核心并引用最后一级缓存中的高速缓存线的请求数量”。因此,我认为这是正确的。


是的。这两个事件是Intel处理器中的架构性能事件。0x4f2e是LLC参考值,被描述为最长延迟缓存引用,而0x412e是LLC缺失,被描述为最长缓存缺失。我从这本手册 Intel manual 中得到这些信息。但是我认为LLC引用仅涵盖命中LLC的内存访问,不包括L1和L2中的缓存命中,因此这并不准确。 - Robert
所以0x4f2e只是命中LLC的缓存引用,不包括命中L1和L2的缓存引用。 - Robert

4

在英特尔处理器上,我认为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标记的事件表示相关缓存中的引用数量。

注意:之前的问题和perf_event_open(perf内部使用)的手册页面可能会有所帮助。


并非perf list中的所有事件都可以映射到硬件性能计数器... - osgx

1
我尝试了Intel的一个工具叫做Vtune,从中得到了一些关于如何测量总缓存引用的线索。他们可以测量微操作码,并过滤那些是读取或存储的指令,以获取总缓存引用。但我不确定perf工具是否也使用了这种方法。

ocperf.py 是来自 pmu-tools https://github.com/andikleen/pmu-tools 的一个工具,它可以通过符号名称使用 Intel 上的任何事件(该脚本只是编程 perf 工具);其中包括几个有用的脚本。 - osgx

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接