2015-04-26 59 views
0

我想了解由perf記錄的緩存未命中。我有一個最小的程序:可以考慮所有的緩存未命中嗎?

int main(void) 
{ 
    return 0; 
} 

如果我編譯如下:

gcc -std=c99 -W -Wall -Werror -O3 -S -o test.S test.c 

我得到果然小程序:

 .file "test.c" 
     .section  .text.startup,"ax",@progbits 
     .p2align 4,,15 
     .globl main 
     .type main, @function 
main: 
.LFB0: 
     .cfi_startproc 
     xorl %eax, %eax 
     ret 
     .cfi_endproc 
.LFE0: 
     .size main, .-main 
     .ident "GCC: (Debian 4.7.2-5) 4.7.2" 
     .section  .note.GNU-stack,"",@progbits 

在只有兩個指令,xorlret中,程序應該小於一個緩存行的大小,所以我期望如果我運行perf -e "cache-misses:u" ./test我應該只看到一個緩存未命中。不過,我反而看到2和400之間。同樣,perf -e "cache-misses" ./test導致〜700至〜2500。

這是一個簡單的perf計算一個計數的例子還是有關於緩存未命中發生的方式使得它們的推理近似?例如,如果我生成並讀取內存中的整數數組,我可以推斷預取(順序訪問應該允許完美的預取)還是還有別的方法?

回答

0

進程內存空間不僅僅是關於你的代碼,還有不同的來源,比如堆,堆棧,數據段也會造成緩存未命中。

process memory space http://www.tenouk.com/ModuleZ_files/cmemory003.png

我不覺得你能估計緩存缺失的數字,就像你無法預知每個線程的運行序列中的多線程程序。

但是,緩存未命中分析對於找出並指定false sharing非常有用。下面是一些有用的鏈接ü可以參考:

  1. http://igoro.com/archive/gallery-of-processor-cache-effects/
  2. http://qqibrow.github.io/CPU-Cache-Effects-and-Linux-Perf/
相關問題