我在 IvyBridge 上,想测试 L1d 缓存组织。我的理解如下:
在 IvyBridge 上,L1d 缓存有 32K 容量,64B 缓存线,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
我的理解有什么问题?