又是一篇cpu硬件探测的博客,这篇是探测L1(数据)/2/3缓存。

测试方法

采取的方式如下:

  • 每次读取:32 字节(一条 AVX2 指令)
  • 每轮循环:256 字节
  • 测试范围:在指定大小内循环(从1KB到32MB)
  • 总读取量:1GB

核心代码

listing_0152_cache_test.asm

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
Read_32x8:
xor r9, r9
mov rax, rdx
align 64

.loop:
; Read 256 bytes
vmovdqu ymm0, [rax]
vmovdqu ymm0, [rax + 0x20]
vmovdqu ymm0, [rax + 0x40]
vmovdqu ymm0, [rax + 0x60]
vmovdqu ymm0, [rax + 0x80]
vmovdqu ymm0, [rax + 0xa0]
vmovdqu ymm0, [rax + 0xc0]
vmovdqu ymm0, [rax + 0xe0]

; Advance and mask the read offset
add r9, 0x100
and r9, r8

; Update the read base pointer to point to the new offset
mov rax, rdx
add rax, r9

; Repeat
sub rcx, 0x100
jnz .loop

ret

代码来自 https://github.com/cmuratori/computer_enhance

测试结果

平均带宽数据表

测试大小 平均带宽 (GB/s)
1KB 265.157236
2KB 208.246211
4KB 176.882216
8KB 182.609472
16KB 187.125108
32KB 194.412047
48KB 182.274637
64KB 102.950966
128KB 105.891953
256KB 94.867362
512KB 93.022204
1MB 76.777218
1.25MB 95.031215
2MB 46.993009
4MB 41.088154
8MB 26.590511
16MB 16.570801
24MB 26.213468
32MB 11.929584
64MB 12.648729
128MB 13.018106
256MB 13.361990
512MB 13.677820

性能分析

带宽曲线图

平均带宽曲线

在 48KB、1.25MB、24MB 出现了明显的带宽下降,这就是 L1/L2/L3 的缓存边界。

CPU缓存规格对比

CPU缓存规格

符合 P-CORE 实际数据。

VTune性能分析

VTune的结果证实了程序确实跑在P-CORE上:

1. 指令执行数量

核心类型 INST_RETIRED.ANY 指令数说明 占比
P-Core 3,104,943,000,000 3.1万亿条指令 99.86%
E-Core 4,489,200,000 44.9亿条指令 0.14%

P-Core 执行了 99.86% 的指令

2. CPU 时钟周期

核心类型 CPU_CLK_UNHALTED.THREAD 周期数说明 占比
P-Core 804,033,700,000 8040亿周期 99.65%
E-Core 2,836,200,000 28.4亿周期 0.35%

P-Core 占用了 99.65% 的 CPU 时间