[轉帖]海光CPU

济南小老虎發表於2024-03-09
https://plantegg.github.io/2021/03/08/%E6%B5%B7%E5%85%89CPU/

海光物理機CPU相關資訊

總共有16臺如下的海光伺服器

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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#lscpu
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian
CPU(s): 64
On-line CPU(s) list: 0-63
Thread(s) per core: 2 //每個物理core有兩個超執行緒
Core(s) per socket: 16 //每路16個物理core
Socket(s): 2 //2路
NUMA node(s): 4
Vendor ID: HygonGenuine
CPU family: 24
Model: 1
Model name: Hygon C86 5280 16-core Processor
Stepping: 1
CPU MHz: 2455.552
CPU max MHz: 2500.0000
CPU min MHz: 1600.0000
BogoMIPS: 4999.26
Virtualization: AMD-V
L1d cache: 32K
L1i cache: 64K
L2 cache: 512K
L3 cache: 8192K
NUMA node0 CPU(s): 0-7,32-39
NUMA node1 CPU(s): 8-15,40-47
NUMA node2 CPU(s): 16-23,48-55
NUMA node3 CPU(s): 24-31,56-63
Flags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl nonstop_tsc cpuid extd_apicid amd_dcm aperfmperf pni pclmulqdq monitor ssse3 fma cx16 sse4_1 sse4_2 movbe popcnt xsave avx f16c rdrand lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw skinit wdt tce topoext perfctr_core perfctr_nb bpext perfctr_llc mwaitx cpb hw_pstate sme ssbd sev ibpb vmmcall fsgsbase bmi1 avx2 smep bmi2 MySQLeed adx smap clflushopt sha_ni xsaveopt xsavec xgetbv1 xsaves clzero irperf xsaveerptr arat npt lbrv svm_lock nrip_save tsc_scale vmcb_clean flushbyasid decodeassists pausefilter pfthreshold avic v_vmsave_vmload vgif overflow_recov succor smca
#numactl -H
available: 4 nodes (0-3)
node 0 cpus: 0 1 2 3 4 5 6 7 32 33 34 35 36 37 38 39
node 0 size: 128854 MB
node 0 free: 89350 MB
node 1 cpus: 8 9 10 11 12 13 14 15 40 41 42 43 44 45 46 47
node 1 size: 129019 MB
node 1 free: 89326 MB
node 2 cpus: 16 17 18 19 20 21 22 23 48 49 50 51 52 53 54 55
node 2 size: 128965 MB
node 2 free: 86542 MB
node 3 cpus: 24 25 26 27 28 29 30 31 56 57 58 59 60 61 62 63
node 3 size: 129020 MB
node 3 free: 98227 MB
node distances:
node 0 1 2 3
0: 10 16 28 22
1: 16 10 22 28
2: 28 22 10 16
3: 22 28 16 10

AMD Zen 架構的CPU是膠水核,也就是把兩個die拼一塊封裝成一塊CPU,所以一塊CPU內跨die之間延遲還是很高的。

7260 系列的hygon CPU(關掉了超執行緒)

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
30
31
32
33
34
#lscpu
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian
Address sizes: 43 bits physical, 48 bits virtual
CPU(s): 48
On-line CPU(s) list: 0-47
Thread(s) per core: 1
Core(s) per socket: 24
Socket(s): 2
NUMA node(s): 8
Vendor ID: HygonGenuine
CPU family: 24
Model: 1
Model name: Hygon C86 7260 24-core Processor
Stepping: 1
Frequency boost: enabled
CPU MHz: 1065.890
CPU max MHz: 2200.0000
CPU min MHz: 1200.0000
BogoMIPS: 4399.38
Virtualization: AMD-V
L1d cache: 1.5 MiB
L1i cache: 3 MiB
L2 cache: 24 MiB
L3 cache: 128 MiB
NUMA node0 CPU(s): 0-5
NUMA node1 CPU(s): 6-11
NUMA node2 CPU(s): 12-17
NUMA node3 CPU(s): 18-23
NUMA node4 CPU(s): 24-29
NUMA node5 CPU(s): 30-35
NUMA node6 CPU(s): 36-41
NUMA node7 CPU(s): 42-47

7280

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
30
31
#lscpu
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian
Address sizes: 43 bits physical, 48 bits virtual
CPU(s): 128
On-line CPU(s) list: 0-127
Thread(s) per core: 2
Core(s) per socket: 32
Socket(s): 2
NUMA node(s): 8
Vendor ID: HygonGenuine
CPU family: 24
Model: 1
Model name: Hygon C86 7280 32-core Processor
Stepping: 1
CPU MHz: 2313.699
BogoMIPS: 3999.47
Virtualization: AMD-V
L1d cache: 2 MiB
L1i cache: 4 MiB
L2 cache: 32 MiB
L3 cache: 128 MiB
NUMA node0 CPU(s): 0-7,64-71
NUMA node1 CPU(s): 8-15,72-79
NUMA node2 CPU(s): 16-23,80-87
NUMA node3 CPU(s): 24-31,88-95
NUMA node4 CPU(s): 32-39,96-103
NUMA node5 CPU(s): 40-47,104-111
NUMA node6 CPU(s): 48-55,112-119
NUMA node7 CPU(s): 56-63,120-127

64 個 core 的分配策略

1
2
3
4
5
physical core processor
0 0~15 0~15
1 0~15 16~31
0 0~15 32~47
1 0~15 48~63

海光bios配置

1
2
3
4
5
6
在grub.conf裡面加入noibrs noibpb nopti nospectre_v2 nospectre_v1 l1tf=off nospec_store_bypass_disable no_stf_barrier mds=off tsx=on tsx_async_abort=off mitigations=off iommu.passthrough=1;持久化ip;掛盤引數defaults,noatime,nodiratime,lazytime,delalloc,nobarrier,data=writeback(因為後面步驟要重啟,把一些OS最佳化也先做了)
2. bios設定裡面
配置 Hygon 設定 --- DF選項 --- 記憶體交錯 --- Channel
--- NB選項 --- 關閉iommu
開啟CPB
風扇模式設定為高效能模式

海光簡介

公司成立於2016年3月,當前送測處理器為其第一代1.0版本的7185對標處理器為Intel的E5-2680V4,其伺服器樣機為曙光H620-G30。

海光CPU的命名規則:
型號71xx
7:高階
1:海光1號
xx:sku

其後續roadmap如下圖

image-20221026100149808

img

海光其產品規格如下,產品相對密集,但是產品之間差異化很小,頻率總體接近。

img

AMD授權Zen IP給海光的操作是先成立合資公司,授權給合資公司基於Zen 研發新的 CPU,而且轉讓給中國的所有資訊都符合美國出口法規天津海光和AMD成立的合資公司可以修改AMD的CPU核,變相享有X86授權,而海光公司可以透過購買合資公司研發的CPU核,開發伺服器CPU,不過僅僅侷限於中國市場。

AMD與國內公司A成立合資公司B,合資公司B由AMD控股,負責開發CPU核(其實就是拿AMD現成的核心),然後公司A購買合資公司B開發的CPU核,以此為基礎開發CPU,最終實現ARM賣IP核的翻版。

image-20221026100539350

image-20221026100646800

海光與AMD 的 Ryzen/EPYC 比較

由於在 Zen 1 的基礎上進行了大量的修改,海光 CPU 可以不用簡單地稱之為換殼 AMD 處理器了。但其效能相比同代原版 CPU 略差:整數效能基本相同,浮點效能顯著降低——普通指令吞吐量只有基準水平的一半。海光 CPU 的隨機數生成機制也被修改,加密引擎已被替換,不再對常見的 AES 指令進行加速,但覆蓋了其他面向國內安全性的指令如 SM2、SM3 和 SM4。

相同

與 AMD 的 Ryzen/EPYC 相比,海光處理器究竟有哪些不同?總體而言,核心佈局是相同的,快取大小、TLB 大小和埠分配都相同,在基礎級別上兩者沒有差異。CPU 仍然是 64KB 四路 L1 指令快取,32KB 八路 L1 資料快取,512KB 八路 L2 快取以及 8MB 十六路 L3 快取,與 Zen 1 核心完全相同。

不同

加密方式變化**

在 Linux 核心升級中有關加密變化的資訊已經明示。這些更新圍繞 AMD 虛擬化功能(SEV)的安全加密進行。通常對於 EPYC 處理器來說,SEV 由 AMD 定義的加密協議控制,在這種情況下為 RSA、ECDSA、ECDH、SHA 和 AES。

但在海光 Dhyana 處理器中,SEV 被設計為使用 SM2、SM3 和 SM4 演算法。在更新中有關 SM2 的部分宣告道,這種演算法基於橢圓曲線加密法,且需要其他私鑰/公鑰交換;SM3 是一種雜湊演算法,類似於 SHA-256;而 SM4 是類似於 AES-128 的分組密碼演算法。為支援這些演算法所需的額外功能,其他指令也被加入到了 Linux 核心中。在說明檔案中指出,這些演算法已在 Hygon Dhyana Plus 處理器上成功進行測試,也已在 AMD 的 EPYC CPU 上成功測試。

此外,海光與 AMD 原版晶片最大的設計區別在於吞吐量,儘管整數效能相同,但海光晶片對於某些浮點指令並未做流水線處理,這意味著吞吐量和延遲都減小了:

img

這些對於最基礎的任務來說也會有所影響,降低吞吐量的設計會讓 CPU 在平行計算時效能受限。另外一個最大的變化,以及 Dhyana 與伺服器版的「Dhyana Plus」版本之間的不同在於隨機數生成的能力。

Openjdk 對海光的支援

https://github.com/openjdk/jdk/commit/d03cf75344fccba375881f0dab4ad169254e650c

https://bugs.openjdk.org/browse/JDK-8222090

https://github.com/dragonwell-project/dragonwell11/pull/517

比較不同 NUMA 方式

bios on and os cmdline off

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
30
lscpu
架構: x86_64
CPU 執行模式: 32-bit, 64-bit
位元組序: Little Endian
Address sizes: 43 bits physical, 48 bits virtual
CPU: 96
線上 CPU 列表: 0-95
每個核的執行緒數: 2
每個座的核數: 24
座: 2
NUMA 節點: 1
廠商 ID: HygonGenuine
CPU 系列: 24
型號: 1
型號名稱: Hygon C86 7260 24-core Processor
步進: 1
Frequency boost: enabled
CPU MHz: 1603.426
CPU 最大 MHz: 2200.0000
CPU 最小 MHz: 1200.0000
BogoMIPS: 4399.55
虛擬化: AMD-V
L1d 快取: 1.5 MiB
L1i 快取: 3 MiB
L2 快取: 24 MiB
L3 快取: 128 MiB
NUMA 節點0 CPU: 0-95
# uname -r
4.19.90-23.8.v2101.ky10.x86_64

測試命令和結果:

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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
//以下多個測試方式的結果一樣
for i in $(seq 0 6 47); do echo core:$i; taskset -c $i ./bin/lat_mem_rd -W 5 -N 5 -t 64M; done >lat.log 2>&1
for i in $(seq 0 6 47); do echo core:$i; numactl -C $i -m 0 ./bin/lat_mem_rd -W 5 -N 5 -t 64M; done >lat.log 2>&1
cat lat.log |grep -E "core:|64.0000"
core:0
64.00000 270.555
core:6
64.00000 231.677
core:12
64.00000 268.527
core:18
64.00000 268.878
core:24
64.00000 158.644
core:30
64.00000 159.796
core:36
64.00000 162.938
core:42
64.00000 112.052
//不綁核會一直慢,因為剛好記憶體在高地址,程式大機率在低core上執行
for i in $(seq 0 6 47); do echo core:$i; numactl -C $i -m 0 ./bin/lat_mem_rd -W 5 -N 5 -t 64M; done >lat.log 2>&1
#cat lat.log |grep -E "core:|64.0000"
core:0
64.00000 267.904
core:6
64.00000 266.112
core:12
64.00000 265.657
core:18
64.00000 266.033
core:24
64.00000 269.574
core:30
64.00000 269.640
core:36
64.00000 269.639
core:42
64.00000 266.373

如果綁核,看起來還是能識別距離遠近,但是需要同時綁記憶體,預設綁核不綁核記憶體達不到就近分配

內建分配預設從高地址開始,所以core 0總是最慢的。

不綁核的話記憶體預設是在高地址,程式大機率遠端訪問記憶體,所以極慢

bios off

測試命令和結果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
//以下三個命令結果一致
for i in $(seq 0 6 47); do echo core:$i; taskset -c $i ./bin/lat_mem_rd -W 5 -N 5 -t 64M; done >lat.log 2>&1
for i in $(seq 0 6 47); do echo core:$i; numactl -C $i -m 0 ./bin/lat_mem_rd -W 5 -N 5 -t 64M; done >lat.log 2>&1
for i in $(seq 0 6 47); do echo core:$i; ./bin/lat_mem_rd -W 5 -N 5 -t 64M; done >lat.log 2>&1
cat lat.log |grep -E "core:|64.0000"
core:0
64.00000 197.570
core:6
64.00000 204.362
core:12
64.00000 198.356
core:18
64.00000 197.049
core:24
64.00000 202.469
core:30
64.00000 199.367
core:36
64.00000 197.790
core:42
64.00000 197.757

rt穩定在200,之所以不符合短板原理是測試中多次取平均導致的,慢的還是慢,有的在近有的在遠的地址,但平均值穩定

交錯編址的時候不會把一個cacheline拆分到多個node下的記憶體條上

測試結果和OS的啟動引數是否numa=off無關

bios off後沒有機會識別記憶體遠近,也就是反覆迴圈分配記憶體不可能一直分配到本node內

bios on and os on

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
30
31
32
33
34
lscpu
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian
Address sizes: 43 bits physical, 48 bits virtual
CPU(s): 48
On-line CPU(s) list: 0-47
Thread(s) per core: 1
Core(s) per socket: 24
Socket(s): 2
NUMA node(s): 8
Vendor ID: HygonGenuine
CPU family: 24
Model: 1
Model name: Hygon C86 7260 24-core Processor
Stepping: 1
Frequency boost: enabled
CPU MHz: 1069.030
CPU max MHz: 2200.0000
CPU min MHz: 1200.0000
BogoMIPS: 4399.35
Virtualization: AMD-V
L1d cache: 1.5 MiB
L1i cache: 3 MiB
L2 cache: 24 MiB
L3 cache: 128 MiB
NUMA node0 CPU(s): 0-5
NUMA node1 CPU(s): 6-11
NUMA node2 CPU(s): 12-17
NUMA node3 CPU(s): 18-23
NUMA node4 CPU(s): 24-29
NUMA node5 CPU(s): 30-35
NUMA node6 CPU(s): 36-41
NUMA node7 CPU(s): 42-47

測試命令和引數:

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
30
31
32
33
34
35
36
37
38
39
40
41
42
for i in $(seq 0 6 47); do echo core:$i; numactl -C $i -m 0 ./bin/lat_mem_rd -W 5 -N 5 -t 64M; done >lat.log 2>&1
# cat lat.log |grep -E "core:|64.0000"
core:0
64.00000 113.048
core:6
64.00000 167.637
core:12
64.00000 164.398
core:18
64.00000 163.328
core:24
64.00000 277.176
core:30
64.00000 277.157
core:36
64.00000 226.747
core:42
64.00000 278.472
綁核不綁記憶體或者不綁核執行結果是一樣的
for i in $(seq 0 6 47); do echo core:$i; taskset -c $i ./bin/lat_mem_rd -W 5 -N 5 -t 64M; done >lat.log 2>&1
for i in $(seq 0 6 47); do echo core:$i; taskset -c $i ./bin/lat_mem_rd -W 5 -N 5 -t 64M; done >lat.log 2>&1
#cat lat.log |grep -E "core:|64.0000"
core:0
64.00000 112.990
core:6
64.00000 113.358
core:12
64.00000 114.146
core:18
64.00000 112.288
core:24
64.00000 114.103
core:30
64.00000 113.331
core:36
64.00000 114.151
core:42
64.00000 113.117

結論

  • 只要是bios numa off後用 lat_mem_rd 測試的 rt 是一個大規模次數後的平均值,但是遠近記憶體問題仍然存在,會導致抖動和卡頓
  • 如果 bios numa on,但是 OS numa off,綁核的話會分別看到不同核訪問記憶體差異極大
  • 如果 bios numa on,同時 OS numa on,這種情況綁核後會出現完美就近訪問,效能最佳
  • 預設地址分配從高地址開始,如果numa off 那麼core 0 最慢;如果 numa on 且綁核會一直快;如果 numa on 但是不綁核,多次測試也是一直快

相關文章