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

C 性能缓存事件的含义是什么?,c,linux,perf,C,Linux,Perf,我试图弄明白为什么修改后的C程序比未修改的计数器部分运行得更快(我添加了很少的代码行来执行一些额外的工作)。在这种情况下,我怀疑“缓存效果”是主要的解释(指令缓存)。因此,我达到了perf(https://perf.wiki.kernel.org/index.php/Main_Page)分析工具,但不幸的是,我无法理解其输出有关缓存未命中的含义 提供了几个有关缓存的事件: cache-references [Hardware

我试图弄明白为什么修改后的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]
我在哪里可以找到关于这些字段的解释?缓存未命中事件始终小于其他事件。这个事件衡量的是什么

在以下示例中,如何解释ls的26760 L1 icache加载未命中与5708缓存未命中

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

您似乎认为
缓存未命中
事件是所有其他类型缓存未命中的总和(
L1 dcache加载未命中
,依此类推)。事实并非如此

缓存未命中
事件表示任何缓存都无法提供的内存访问次数

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

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


例如,通过阅读它,您可以看到perf列表显示的
缓存未命中
事件对应于
perf\u COUNT\u HW\u cache\u未命中
,根据,性能监控单元(PMU)事件或硬件事件指的是那些可以直接映射到CPU供应商的CPU特定事件的事件。但是硬件缓存事件指的是
perf
提供的一些硬件事件名字对象,这些名字对象可能映射到CPU提供的实际事件。有关
perf
缓存事件的列表,请使用Linux终端中的
perf list cache

谢谢您的回答。你在用这个工具吗?如何解释称为硬件事件而不是硬件缓存事件的缓存未命中事件。我认为这是其他人的总和,但根本不是。此外,“加载”和“预回迁”之间有什么区别?@ManuelSelva:我自己没有使用
perf
,所以我几乎没有实际经验。特别是,与所有硬件缓存事件相比,我不确定
缓存未命中事件实际上描述了什么。我也不完全确定预取:有一种方法可以在应用程序级别触发预取,也可以自动预取硬件预测的数据访问。预取计数器实际描述的可能是其中一个或两个<代码>性能
文档中提到了制造商规格以获取更多详细信息,但我还没有找到相关章节。@ManuelSelva“加载”是指程序执行加载指令以检索内存。“预取”是指处理器猜测您将在不久的将来加载内存,并提前获取内存。这样,当您的程序确实使用内存时,它将已经在缓存中。另请参阅,以了解有关最近英特尔CPU上某些通用事件映射到硬件事件的一些基本信息。我发现这很有用: