C 性能缓存事件的含义是什么?
我试图弄明白为什么修改后的C程序比未修改的计数器部分运行得更快(我添加了很少的代码行来执行一些额外的工作)。在这种情况下,我怀疑“缓存效果”是主要的解释(指令缓存)。因此,我达到了C 性能缓存事件的含义是什么?,c,linux,perf,C,Linux,Perf,我试图弄明白为什么修改后的C程序比未修改的计数器部分运行得更快(我添加了很少的代码行来执行一些额外的工作)。在这种情况下,我怀疑“缓存效果”是主要的解释(指令缓存)。因此,我达到了perf(https://perf.wiki.kernel.org/index.php/Main_Page)分析工具,但不幸的是,我无法理解其输出有关缓存未命中的含义 提供了几个有关缓存的事件: cache-references [Hardware
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
一些答案:
是一级缓存,是最小、最快的一级缓存<另一方面,code>LLC指的是缓存的最后一级,因此表示最大但最慢的缓存L1
vs.i
区分指令缓存和数据缓存。只有L1以这种方式拆分,其他缓存在数据和指令之间共享d
指的是,将虚拟地址映射到物理地址时使用的缓存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上某些通用事件映射到硬件事件的一些基本信息。我发现这很有用: