我正在运行一个1循环并测量缓存未命中。
int main() {
while(1);
}
这个特定的进程绑定到一个cpu(使用taskset),这个cpu是隔离的,这意味着没有其他进程可以在同一个cpu上进行调度。现在我开始使用perf
来测量缓存性能,令我惊讶的是,最后一级缓存未命中率为42%。
22,579 cache-references (20.82%)
8,976 **cache-misses # 39.754 %** of all cache refs (20.83%)
4,414 **LLC-load-misses # 42.74%** of all LL-cache hits
我很惊讶,因为我没有进行任何内存操作,所以我预计零缓存未命中。对此有任何帮助/想法。 cpu:型号名称:Intel(R)Xeon(R)CPU E5-2670 v3 @ 2.30GHz
我做了另一个实验,给出了1毫秒的纳米睡眠,缓存未命中率降低到不到1%。我对最近发生的事情一无所知。
答案 0 :(得分:1)
可能perf计数器正在计算中断处理程序中内核代码的一些事件。 perf计数器事件并不精确,因此您将获得归因于附近指令的计数,并且当内核代码执行iret
时,我猜想仍然在管道中的操作。或者这可能只是完全计算内核上下文中发生的事件,因为在每个中断上乱用perf计数器会很昂贵。
请注意,如果您没有考虑缓存访问的次数,那么缓存未命中率只会很糟糕,总计:
$ perf stat -e cycles,instructions,L1-dcache-loads,LLC-load-misses,LLC-loads,cache-references,cache-misses ./infloop
Performance counter stats for './infloop':
6,177,174,823 cycles (28.79%)
6,167,361,425 instructions # 1.00 insns per cycle (43.00%)
1,884,882 L1-dcache-loads (42.93%)
13,133 LLC-load-misses # 19.41% of all LL-cache hits (42.75%)
67,676 LLC-loads (28.74%)
391,004 cache-references (28.50%)
18,025 cache-misses # 4.610 % of all cache refs (28.42%)
2.604227273 seconds time elapsed
定时使用Conroe Core2Duo E6600(因为我将英特尔SnB主板与英特尔破坏的BIOS更新结合在一起)。
cache-references
和cache-misses
是"内核PMU事件",而LLC-*
和L1-*
是"硬件缓存事件",根据{{1}}。我不确定这意味着什么。