我想了解由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
在只有兩個指令,xorl
和ret
中,程序應該小於一個緩存行的大小,所以我期望如果我運行perf -e "cache-misses:u" ./test
我應該只看到一個緩存未命中。不過,我反而看到2和400之間。同樣,perf -e "cache-misses" ./test
導致〜700至〜2500。
這是一個簡單的perf計算一個計數的例子還是有關於緩存未命中發生的方式使得它們的推理近似?例如,如果我生成並讀取內存中的整數數組,我可以推斷預取(順序訪問應該允許完美的預取)還是還有別的方法?