C语言 性能缓存事件的含义是什么



我试图弄清楚为什么修改后的C程序比未修改的对应程序运行得更快(我添加了很少的代码行来执行一些额外的工作)。在这种情况下,我怀疑"缓存效应"是主要解释(指令缓存)。因此,我使用了perf(https://perf.wiki.kernel.org/index.php/Main_Page)分析工具,但不幸的是,我无法理解其输出中有关缓存未命中的含义。

提供了有关缓存的几个事件:

  cache-references                                   [Hardware event]
  cache-misses                                       [Hardware event]
  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]
  dTLB-loads                                         [Hardware cache event]
  dTLB-load-misses                                   [Hardware cache event]
  dTLB-stores                                        [Hardware cache event]
  dTLB-store-misses                                  [Hardware cache event]
  dTLB-prefetches                                    [Hardware cache event]
  dTLB-prefetch-misses                               [Hardware cache event]
  iTLB-loads                                         [Hardware cache event]
  iTLB-load-misses                                   [Hardware cache event]
  branch-loads                                       [Hardware cache event]
  branch-load-misses                                 [Hardware cache event]
  node-loads                                         [Hardware cache event]
  node-load-misses                                   [Hardware cache event]
  node-stores                                        [Hardware cache event]
  node-store-misses                                  [Hardware cache event]
  node-prefetches                                    [Hardware cache event]
  node-prefetch-misses                               [Hardware cache event]

我在哪里可以找到有关这些字段的说明? cache-misses 事件始终小于其他事件。此事件衡量什么?

如何解释 ls 的 26,760 次 L1-icache-load-misses 与以下示例中的 5,708 次缓存未命中?

perf stat -e L1-icache-load-misses ls
caches  caches~  out
 Performance counter stats for 'ls':
            26,760 L1-icache-load-misses                                       
       0.002816690 seconds time elapsed

perf stat -e cache-misses ls
caches  caches~  out
 Performance counter stats for 'ls':
             5,708 cache-misses                                                
       0.002822122 seconds time elapsed

一些答案:

  • L1是一级缓存,最小和最快的缓存。 另一方面,LLC是指缓存层次结构的最后一级,因此表示最大但最慢的缓存。
  • i vs. d将指令缓存与数据缓存区分开来。只有L1以这种方式被拆分,其他缓存在数据和指令之间共享。
  • TLB是指转换后备缓冲区,这是将虚拟地址映射到物理地址时使用的缓存。
  • 不同的 TLB 计数器取决于命名地址是指指令还是某些数据。
  • 对于所有数据访问,根据给定的内存位置是读取、写入还是预取(即检索以供稍后读取)来保留不同的计数器。
  • 未命中数指示访问给定数据项但缓存中不存在的频率。

您似乎认为cache-misses事件是所有其他类型的缓存未命中(L1-dcache-load-misses等)的总和。这实际上不是真的。

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

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

但是,可以通过阅读 perf_event_open() 函数的文档(假设您已经对 CPU 和性能监控单元的工作原理有很好的了解,这显然不是计算机体系结构课程)来了解很多:

http://web.eece.maine.edu/~vweaver/projects/perf_events/perf_event_open.html

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

根据 perf 教程,性能监视单元 (PMU) 事件或硬件事件是指可以直接映射到 CPU 供应商的 CPU 特定事件的事件。但是硬件缓存事件是指perf提供的一些硬件事件名字对象,这些事件可以映射到CPU提供的实际事件。有关perf 的缓存事件列表,请使用 Linux 终端中的perf list cache

最新更新