我想测量我的代码的缓存未命中率。我们可以使用 perf list 来显示支持的事件。我的台式机有一个 Intel(R) Core(TM) i5-2400 CPU @ 3.10GHz 处理器,性能列表包含缓存引用和缓存未命中,如下所示:
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]
Run Code Online (Sandbox Code Playgroud)
我认为缓存未命中根据英特尔架构软件开发人员手册映射到硬件事件 LLC 未命中(我通过比较perf stat -e r412e和perf stat -e cache-misses 来确认这一点,它们给出了几乎相同的结果)。但是缓存引用是如何计算的呢?我没有找到使用现有硬件事件获取总缓存引用的事件或方法。所以我想知道这个缓存引用在我的电脑上是否准确?
如果您查看内核代码中的 arch/x86/kernel/cpu/perf_event_intel.c。你会看到
"PERF_COUNT_HW_CACHE_REFERENCES = 0x4f2e".
Run Code Online (Sandbox Code Playgroud)
然而
"PERF_COUNT_HW_CACHE_MISSES= 0x412e"
Run Code Online (Sandbox Code Playgroud)
X86 架构手册说 0x4f2e 是“此事件对源自引用最后一级缓存中的缓存行的内核的请求进行计数”。所以我认为它是正确的。
在英特尔上,我认为没有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]
Run Code Online (Sandbox Code Playgroud)
未标记的事件-misses
表示关联缓存中的引用数。
注意:上一个问题和有关 perf_event_open 的手册页(由 perf 内部使用)可能会有所帮助。
归档时间: |
|
查看次数: |
4773 次 |
最近记录: |