【轉】華為 VS 龍芯 國產CPU架構初步探測、對比與分析
華為 VS 龍芯 國產CPU架構初步探測、對比與分析

星邊疆
希望親眼見到人類步入星際文明的硬核科幻迷、RPG游戲開發(fā)者
本次測試由一些相關愛好者共同完成,我們在討論和測試后,探測和分析了一些關于華為海思和龍芯 的CPU架構的信息。需要注意的是,這些對架構的探測是初步的,不確切的,不是他們的全貌。
主要的測試方式來自這篇文章:
CPU微架構信息探測 新手入門級69 贊同 · 1 評論文章
架構代號TSV 110LX910LX920GS464VLA464LA664Zen3CPUKunpeng 920Kirin 9000SKirin 9000S3A40003A50003A6000R7-5800XDecode4664464Rename4664466ALU3444444AGU2442244ROB~180224+32= 256?~256128128256256PRF(int)~140~160~192128128144+48= 192?192PRF(float)~96~160~192128128144+48= 192?160LDQ~48~78~1286464>5272STQ~32~54~724848~6464L1I64KB64KB64KB64KB64KB128KB32KBL1D64KB64KB64KB64KB64KB128KB32KBL2512KB512KB1MB256KB256KB512KB512KBL3(共享)8MB4MB4MB8MB16MB16MB32MBL4(SLC)N/A4MB4MBN/AN/AN/AN/A
下面是其它國產處理器產商的微架構探測信息
架構代號CNRLujiazuiCNSYongFengFTC663ZenCPUZX-CKX-6780AZX-F/CHAKH-40000D2000Hygon C3250Decode324434Rename324434ALU3244?24AGU2222?22ROB~64~48~192160+32= 192?~148192PRF(int)~64非寄存器堆設計,2 個ALU port,12 × 2~146 (130+16)112+32= 144?96+32= 128?168PRF(float)~62非寄存器堆設計,2 個ALU port,12 × 2~144 (80+64)128+32= 160?148+32= 180?160LDQ~16~24~72~64~3272STQ~16~22~46~48~2844L1I64KB32KB32KB64KB48KB64KBL1D64KB32KB32KB32KB32KB32KBL22MB4MB512KB256KB2MB(4核共享)512KBL3(共享)N/AN/A16MB8MB4MB8MBL4(SLC)N/AN/AN/AN/AN/AN/A
下面是Intel的微架構探測信息
Intel 大核架構Core /PenrynSNB/IvyHaswellBroadwellSkylakeSNC/WLCGLC/RPCCPUT7500/QX9300i7-2600/I7-3770i7-4770i7-5775Ci7-6700~i7-10700I7-11700/I7-1165G7i7-12700/i7-13700Decode44444-55-66Rename44444-65-66ALU3333445AGU2233345ROB96168192192224352512PRF(int)非寄存器堆設計,調度器32隊列160168168180280280PRF(float)非寄存器堆設計,調度器32隊列144168168168224332LDQ3264727272128192STQ203642425672114L1I32KB32KB32KB32KB32KB32KB32KBL1D32KB32KB32KB32KB32KB48KB48KBL23MB/6MB
全核共享256KB256KB256KB256KB512KB/1.25MB1.25MB/2MBL3(共享)N/A2 MB 每核, 全核共享1.5 - 3 MB 每核, 全核共享1.5/2.0/2.5MB 每核, 全核共享4-16MB16MB/12MB30MB/36MBL4(SLC)N/AN/AN/A128MBN/AN/AN/A
SPEC CPU 2006 1T Geomean Total
編譯條件:
R7-5800X Test 1 ->
GCC 8.3 or 12.2 -Ofast -fomit-frame-pointer -march=x86-64 -mtune=core-avx2 -mavx -mavx2
兩個版本都差不多
R7-5800X Test 2->
GCC12.2 -Ofast -march=alderlake -mtune=alderlake
Kirin9000S and Kunpeng920 Test 1 ->
GCC12.2 -Ofast -static
loongson 3A4000 Test1 ->
GCC 8.3 -Ofast -mabi=64 -march=loongson3a -mtune= loongson3a -mloongson -sx -mloongson -asx -static -flto
loongson 3A4000 Test2 ->
GCC 8.3 -Ofast -static -flto -funroll-all-loops -mmsa -fomit-frame-pointer -fprefetch-loop-arrays
-finline-functions -ftree-vectorize -faggressive-loop-optimizations -ffast-math
or
GCC 8.3 -Ofast -static -mmsa -march=gs464v -mtune=gs464v -funroll-all-loops
測試結果都差不多
loongson 3A5000 Test1 ->
GCC 8.3 -Ofast -static -flto -march=loongarch64 -mtune=loongarch64 -mlsx -mlasx -funroll-all-loops
loongson 3A5000 Test2->
GCC 8.3 -Ofast -static -flto -mabi=lp64 -march=loongarch64 -mtune=loongarch64 -mlsx -mlasx -ftree -vectorize
loongson 3A6000 Test1 ->
GCC 8.3 -Ofast -static -flto -march=loongarch64 -mtune=loongarch64 -mlsx -mlasx -funroll-all-loops
loongson 3A6000 Test2 ->
int test : ->
GCC 8.3 -Ofast -static -flto -mcond-move-int -mforce-drap -mvecarg -march=la664 -mtune=la664
-msimd=lasx -ftree-vectorize -funroll-all-loops
float test : ->
GCC 8.3 -Ofast -static -flto -mcond-move-int -mforce-drap -mvecarg -march=la464 -mtune=la464 -msimd=lasx -ftree-vectorize -funroll-all-loops -fuse-linker-plugin
解釋一下這些旗標的作用:
-Ofast
: 這個旗標告訴編譯器使用最高級別的優(yōu)化。它包括所有的?-O3
?優(yōu)化,并且還可啟用、一些額外的編譯選項優(yōu)化,以提高程序的性能,但這些編譯優(yōu)化選項可能會犧牲一些穩(wěn)定性。如?
-ffast-math
,這個旗標的目標是最大化代碼的性能,但可能會犧牲一些數學精度。-static
: 這個旗標指示編譯器生成一個靜態(tài)鏈接的可執(zhí)行文件,不依賴于外部共享庫。-flto
: Link-Time Optimization(LTO)是一種編譯器優(yōu)化技術,它允許編譯器在鏈接階段對整個程序進行全局優(yōu)化。-mtune
: 這個旗標用于指定目標處理器的類型,以便編譯器生成針對該處理器類型的代碼。-funroll-all-loops
: 這個旗標告訴編譯器嘗試展開所有循環(huán),以減少循環(huán)的開銷。-mmsa
: 這個旗標啟用了針對多媒體擴展的優(yōu)化,有助于處理SPEC06 464.h264ref 多媒體數據。-fomit-frame-pointer
: 這個旗標告訴編譯器不生成函數調用的堆棧幀指針,以減少函數調用的開銷。-fprefetch-loop-arrays
: 這個旗標啟用了對數組的預取操作,以提高訪問數組元素的效率。-finline-functions
: 這個旗標啟用了函數內聯優(yōu)化,將適當的函數內容嵌入調用點,以減少函數調用的開銷。-ftree-vectorize
: 這個旗標啟用了向量化優(yōu)化,以便編譯器能夠將循環(huán)操作轉化為矢量化指令,提高代碼的并行執(zhí)行性能。-faggressive-loop-optimizations
: 這個旗標告訴編譯器啟用激進的循環(huán)優(yōu)化,以最大程度地提高循環(huán)性能。-mabi
、-march
?: 這些旗標用于指定目標處理器的體系結構和ABI(Application Binary Interface),以便生成針對特定體系結構和ABI的代碼。-mloongsonsx 和 -mloongson-asx、
-msimd=lasx
、: 這個旗標是特定于目標架構的擴展選項,它啟用了龍架構的SIMD(Single Instruction, Multiple Data)優(yōu)化。-march=x86-64
: 這個旗標指定目標體系結構為x86-64,即64位x86處理器架構,也稱為AMD64或Intel 64。-mtune=core-avx2
: 這個旗標告訴編譯器生成針對特定處理器微體系結構的代碼。在這種情況下,它針對支持AVX2指令集的處理器進行優(yōu)化。-march=la664
?和?-mtune=la664
: 這些旗標指定了目標處理器架構為la664的架構和微體系結構,以便生成針對這些處理器優(yōu)化的代碼。-march=alderlake 和 -mtune=alderlake : 這些旗標指定了目標處理器架構為alderlake 的架構和微體系結構,以便生成針對這些處理器優(yōu)化的代碼。
-mcond-move-int
:這個旗標用于啟用條件移動(conditional move)的整數優(yōu)化。條件移動是一種在條件為真或假時選擇兩個不同的值而無需使用分支指令的優(yōu)化技術。通常,這在條件分支語句(如if語句)中使用,以減少分支預測錯誤的可能性和優(yōu)化性能。啟用此標志后,編譯器會嘗試將條件分支轉換為條件移動指令,從而提高代碼的執(zhí)行速度。-mforce-drap
:這個旗標用于強制使用延遲分支風格的代碼生成。條件分支指令的執(zhí)行結果不會立即影響程序計數器(PC)。使用此標志可以告訴編譯器生成適用于延遲分支的代碼,以確保正確執(zhí)行。-mvecarg
:這個旗標用于指定矢量寄存器參數傳遞的約定,以便與目標架構和編譯器期望的調用約定相匹配。在一些處理器架構中,特別是支持SIMD(Single Instruction, Multiple Data)指令的架構,函數參數可以通過矢量寄存器傳遞,以便進行高效的矢量化計算。
Test1 無指定架構優(yōu)化TSV 110LX910LX920GS464VLA464LA664Zen3CPUKunpeng 920Kirin 9000SKirin 9000S3A40003A50003A6000R7-5800X測試頻率2.6GHz1.9GHz2.6GHz1.8GHz2.5GHz2.5GHz4.8GHz內存DDR4-3200LPDDR5-6400LPDDR5-6400DDR4-2133DDR4-3200DDR4-3200DDR4-3200SPEC06 Rate1 IntBase 幾何總分28.826.135.214.926.6~35.768.5SPEC06 Rate1 floatBase 幾何總分26.635.950.317.627.9~49.985.4SPEC06 Rate1 幾何總分27.730.64216.227.2~42.276.5
Test2 含特殊優(yōu)化GS464VLA464LA664Zen3CPU3A40003A50003A6000R7-5800X測試頻率1.8GHz2.5GHz2.5GHz4.8GHz內存DDR4-2400DDR4-3200DDR4-3200DDR4-3200SPEC06 Rate1 IntBase 幾何總分17.52640.175.9SPEC06 Rate1 floatBase 幾何總分N/A29.751.7100SPEC06 Rate1 幾何總分N/A27.945.587.1
優(yōu)化增益Test2/Test1GS464VLA464LA664Zen3CPU3A40003A50003A6000R7-5800X測試頻率1.8GHz2.5GHz2.5GHz4.8GHz內存DDR4-2400DDR4-3200DDR4-3200DDR4-3200SPEC06 Rate1 IntBase 變化17.5%-2.25%12.9%12.5%SPEC06 Rate1 floatBase 變化N/A6.4%3.6%7.1%
我們注意到龍芯處理器的微架構具有與以往微架構設計不同的地方,GS464V、LA464和LA664都傾向于采用較大規(guī)模的ALU,較大的一級緩存,以及激進的SIMD指令優(yōu)化策略,重視通過編譯器優(yōu)化來改進處理器的每周期指令與數據的吞吐量,通過每周期吞吐更多、更密集的SIMD指令來減少分支預測錯誤帶來的懲罰,這讓它在編譯器上具有非常高的改進空間,但這會導致部分SPEC項目的成績對內存性能和緩存性能非常敏感。
同時我們注意到,LA664的硬件指令預取調度器似乎仍然無法很好工作,它主要通過編譯器進行調度指令預取比其它微架構的硬件預取器更有效果,但這讓它失去了很好的通用性。
我們發(fā)現guee的測試中龍芯SPECCPU2006 成績高很大一部分是因為它采用針對GS464V、LA664架構的編譯選項,并開啟了SIMD向量化并行等一系列優(yōu)化選項。從而能高效地從大L1和L3進行數據預取,造成緩存性能高,SPEC06相比SPEC17是個非常吃緩存性能的測試項目,429.mcf、456.hmmer、462.libquantum 、464.h264ref、471.omnetpp、 483.xalancbmk一般是比較吃數據預取性能,而龍架構與其它架構的硬件預取器有些不同,主要采用軟件實現這方面的調度,龍芯可以升級編譯器來提高這方面的性能,自然跑分更好看一些,而且龍芯3A6000的L1I是128KB,相比3A5000的64KB翻倍了,可以預取更多的數據到L1I里面,這樣緩存性能就比較高,但對于其它的項目 例如 403.gcc、473.astar這類吃分支預測性能的項目提升不大。
而-mtune=LA464是龍架構的編譯器默認的編譯選項,其對齊寬度默認為LA464的對齊寬度,GS464V和LA464是兩個非常相似的微架構,龍芯3A5000相比3A4000大幅度優(yōu)化了緩存性能,內存控制器從DDR4-2400升級到DDR4-3200,三級緩存翻倍,內存帶寬提高了約1.5倍,緩存帶寬和延遲也改進了許多,而且龍架構相比MIPS架構優(yōu)化了一些不常用指令,使平均指令密度提高了約7%,這讓3A5000的IPC在編譯器、架構指令密度和緩存性能的改進下提高了很多。
同樣采用-mtune=alderlake旗標進行針對性優(yōu)化的Zen3也可以做到與同樣的性能增益幅度,當然英特爾12、13、14代處理器同樣也可以。
從微架構設計上來看,LA664與Zen3、LX910/LX920基本處于同一個水平,它們的各項硬件堆料相近。
此次測試因為龍芯送測時間有限和華為突然開售的原因,我們沒有辦法使用華為的閉源編譯器來使用 類似于-mtune=LX920的旗標,從而導致無法了解針對性優(yōu)化后的性能,但我們通過guee開源的flag,了解到使用了龍芯系統默認提供的GCC8.3閉源編譯器存在針對LA664架構的優(yōu)化選項,但我們尋找GCC的提交記錄沒有找到關于-mtune=LA664的優(yōu)化旗標,但相信隨著龍芯編譯器代碼的完善,可以在GCC主線中看到-mtune=LA664的旗標。

LoongArch:使用 -mtune 設置函數和標簽的默認對齊方式
LA464 微架構對代碼對齊很敏感。龍芯團隊對各種功能組合進行了對標, 結果 [1] 顯示 16 字節(jié)標簽與 32 字節(jié)標簽對齊 函數對齊在 SPEC 分數方面給出了最佳結果。 添加基于mtune的表驅動機制,設置默認的 -falign-{函數,標簽}。由于 LA464 是第一個(也是唯一一個) 現在)GCC 支持 的微架構,同樣的設置也用于 “通用的”-mtune=loongarch64。未來我們可能會設置不同的 一旦我們添加了對 LA{2,3,6}64 微架構的支持,它們的設置就可以了。
LoongArch: Set default alignment for functions and labels with -mtunegithub.com/gcc-mirror/gcc/commit/19e4d4c34c98d19d64eb2a5ed3d252685b9470be



測試數據來源


龍芯相關測試的圖片,感謝?
@guee
?的測試flag開源
guee/國產CPU的一些性能測試結果









感謝?
@Edison Chen
?分享的 -mtune=alderlake旗標的5800X的數據。


編輯于 2023-09-10 20:18

發(fā)布一條帶圖評論吧
3 條評論
默認
最新
常成
有3a6000的 spec2017 rate 1成績么?
09-09?·?IP 屬地湖南
Chen
另外,3A6000的微架構里,ALU 和 FPU 和 AGU 應該都是四個,來源是?龍芯中科(688047) 投資者互動_F10_同花順金融服務網在 6 月 19 號的回復:“目前,龍芯3A6000中使用的六發(fā)射處理器核LA664的深度(如ROB項數達到256項)、寬度(如四定點、四浮點、四訪存共12個功能部件)都不是瓶頸”
昨天 01:34?·?IP 屬地北京
Chen
Loongnix 的 GCC 8.3.0 其實是開源的,可以從源里面下載源碼(pkg.loongnix.cn/loongni),但里面是一堆 patch,很多修改沒有貢獻到上游。
昨天 01:31?·?IP 屬地北京