我想测量代码的缓存未命中率。我们可以使用perf list来显示支持的事件。我的桌面有一个Intel(R)Core(TM)i5-2400 CPU @ 3.10GHz处理器,perf列表包含缓存参考和缓存未命中,如下所示:
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]
根据英特尔架构软件开发人员手册,我认为缓存未命中映射到硬件事件LLC未命中(我通过比较性能-e r412e 和来确认这一点perf stat -e cache-misses ,它们给出了几乎相同的结果)。但是如何计算缓存引用?我没有找到使用现有硬件事件获取总缓存引用的事件或方法。所以我想知道这个缓存引用在我的计算机上是否准确?
答案 0 :(得分:4)
如果你在内核代码中查看arch / x86 / kernel / cpu / perf_event_intel.c。你会看到
"PERF_COUNT_HW_CACHE_REFERENCES = 0x4f2e".
在哪里
"PERF_COUNT_HW_CACHE_MISSES= 0x412e"
X86架构手册说0x4f2e是"此事件计算来自核心的请求,该核心引用最后一级缓存中的缓存行"。所以我认为它是正确的。
答案 1 :(得分:3)
在Intel上,我认为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]
未标记为-misses
的事件表示关联缓存中的引用数。
答案 2 :(得分:1)
我尝试了一个名为Vtune的工具来自英特尔,我得到了一些关于如何测量总缓存引用的线索。他们可以测量微操作代码,并过滤那些加载或存储的指令,以获得总缓存引用。但我不确定perf工具是否也使用这种方法。