[英]Intel Core i7 processor and cache behaviour
我已經在英特爾酷睿i7 CPU(具有32KB L1數據高速緩存和64B L1高速緩存行大小)上運行以下匯編代碼:(對1000萬個元素(每個4字節)的數組進行1000次迭代)
main:
.LFB0:
.cfi_startproc
mov edx, 1000
jmp .L2
.L3:
mov ecx, DWORD PTR v[0+eax*4]
add eax, 1
cmp eax, 10000000
jl .L3
sub edx, 1
je .L4
.L2:
mov eax, 0
jmp .L3
.L4:
mov eax, 0
ret
.cfi_endproc
Perf提供以下統計信息:
10,135,716,950 L1-dcache-loads
601,544,266 L1-dcache-load-misses # 5.93% of all L1-dcache hits
4.747253821 seconds time elapsed
這是完全有道理的,因為我正在訪問內存中的1 000 * 10 000 000 = 10 000 000 000個元素,並且高速緩存行為64B(向量中的一個元素為4 B),這意味着每16個元素會發生一次L1高速緩存未命中(因此,大約有625 000 000 L1高速緩存未命中)。
現在,我已經“展開”了循環的一部分,代碼是:
.cfi_startproc
mov edx, 1000
jmp .L2
.L3:
mov ecx, DWORD PTR v[0+eax*4]
mov ecx, DWORD PTR v[0+eax*4 + 4]
mov ecx, DWORD PTR v[0+eax*4 + 8]
mov ecx, DWORD PTR v[0+eax*4 + 12]
add eax, 4
cmp eax, 2500000
jl .L3
sub edx, 1
je .L4
.L2:
mov eax, 0
jmp .L3
.L4:
mov eax, 0
ret
.cfi_endproc
Perf如何提供以下統計信息:
2,503,436,639 L1-dcache-loads
123,835,666 L1-dcache-load-misses # 4.95% of all L1-dcache hits
0.629926637 seconds time elapsed
我不明白為什么?
1)因為我正在訪問相同數量的數據,所以L1緩存的負載更少了?
2)代碼運行速度比第一個版本快6倍嗎? 我知道這與亂序執行和超標量執行有關,但是我無法詳細解釋(我想確切地了解是什么原因導致了這種加速)。
壞消息-您在第二個中有一個錯誤;)
原始碼
.L3:
mov ecx, DWORD PTR v[0+eax*4]
add eax, 1
cmp eax, 10000000
jl .L3
第二版
.L3:
mov ecx, DWORD PTR v[0+eax*4]
mov ecx, DWORD PTR v[0+eax*4 + 4]
mov ecx, DWORD PTR v[0+eax*4 + 8]
mov ecx, DWORD PTR v[0+eax*4 + 12]
add eax, 4
cmp eax, 2500000 <- here
jl .L3
在這兩種情況下,您都需要加載1000萬個元素。 兩種情況下訪問的最大元素地址必須相同,對嗎?
因此,在第一種情況下,最大地址為:
(10.000.000-1)*4 = 39.999.996
第二:
(2.500.000-4)*4+12 = 9.999.996
少四倍
只需將第二個示例修復為cmp eax, 10000000
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.