缓存在无限循环中丢失而没有内存引用?

时间:2016-03-28 04:31:47

标签: performance caching x86

我正在运行一个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%。我对最近发生的事情一无所知。

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-referencescache-misses是"内核PMU事件",而LLC-*L1-*是"硬件缓存事件",根据{{​​1}}。我不确定这意味着什么。