我试图弄清楚为什么修改后的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
。