Я нахожусь на IvyBridge и хочу проверить организацию кэша L1d. Мое понимание таково:
В IvyBridge кэш L1d имеет емкость 32 КБ, строку кэша 64 Б, ассоциативно настроенный 8-канальный. Поэтому он имеет 32K / (64 * 8) = 64 набора, учитывая основную память addr
, индекс набора может быть вычислен как (addr/64) % 64
.
Так что, если я увеличу основную память на 64 * 64 (4K), я всегда буду касаться одного и того же набора L1d. В наборе всего 8 строк кэша, поэтому, если зациклить его на 16 шагов, я получу почти 100% пропуск кэша L1d.
Я пишу следующую программу для проверки:
section .bss
align 4096
buf: resb 1<<26
%define gap 64 * 64 ; no L1 cache miss
; %define gap 64 * 64 * 256 ; 41% L1 cache miss
; %define gap 64 * 64 * 512 ; 95% L1 cache miss
; however, total cycle suggests this gap is already at L3 latency level with complete L2 cache miss.
section .text
global _start
_start:
mov rcx, 10000000
xor rax, rax
loop:
mov rax, [buf+rax]
mov rax, [buf+rax+gap*1]
mov rax, [buf+rax+gap*2]
mov rax, [buf+rax+gap*3]
mov rax, [buf+rax+gap*4]
mov rax, [buf+rax+gap*5]
mov rax, [buf+rax+gap*6]
mov rax, [buf+rax+gap*7]
mov rax, [buf+rax+gap*8]
mov rax, [buf+rax+gap*9]
mov rax, [buf+rax+gap*10]
mov rax, [buf+rax+gap*11]
mov rax, [buf+rax+gap*12]
mov rax, [buf+rax+gap*13]
mov rax, [buf+rax+gap*14]
mov rax, [buf+rax+gap*15]
dec rcx,
jne loop
xor rdi, rdi
mov rax, 60
syscall
К моему удивлению, perf
показывает, что кэш-память L1 отсутствует вообще:
160,494,057 L1-dcache-loads
4,290 L1-dcache-load-misses # 0.00% of all L1-dcache hits
Что не так в моем понимании?