欢迎光临散文网 会员登陆 & 注册

【转】华为 VS 龙芯 国产CPU架构初步探测、对比与分析

2023-09-11 04:49 作者:小林家的垃圾王R  | 我要投稿


华为 VS 龙芯 国产CPU架构初步探测、对比与分析

星边疆

希望亲眼见到人类步入星际文明的硬核科幻迷、RPG游戏开发者

本次测试由一些相关爱好者共同完成,我们在讨论和测试后,探测和分析了一些关于华为海思和龙芯 的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


解释一下这些旗标的作用:
  1. -Ofast: 这个旗标告诉编译器使用最高级别的优化。它包括所有的 -O3 优化,并且还可启用、一些额外的编译选项优化,以提高程序的性能,但这些编译优化选项可能会牺牲一些稳定性。

  2. 如 -ffast-math,这个旗标的目标是最大化代码的性能,但可能会牺牲一些数学精度。

  3. -static: 这个旗标指示编译器生成一个静态链接的可执行文件,不依赖于外部共享库。

  4. -flto: Link-Time Optimization(LTO)是一种编译器优化技术,它允许编译器在链接阶段对整个程序进行全局优化。

  5. -mtune: 这个旗标用于指定目标处理器的类型,以便编译器生成针对该处理器类型的代码。

  6. -funroll-all-loops: 这个旗标告诉编译器尝试展开所有循环,以减少循环的开销。

  7. -mmsa: 这个旗标启用了针对多媒体扩展的优化,有助于处理SPEC06 464.h264ref 多媒体数据。

  8. -fomit-frame-pointer: 这个旗标告诉编译器不生成函数调用的堆栈帧指针,以减少函数调用的开销。

  9. -fprefetch-loop-arrays: 这个旗标启用了对数组的预取操作,以提高访问数组元素的效率。

  10. -finline-functions: 这个旗标启用了函数内联优化,将适当的函数内容嵌入调用点,以减少函数调用的开销。

  11. -ftree-vectorize: 这个旗标启用了向量化优化,以便编译器能够将循环操作转化为矢量化指令,提高代码的并行执行性能。

  12. -faggressive-loop-optimizations: 这个旗标告诉编译器启用激进的循环优化,以最大程度地提高循环性能。

  13. -mabi-march : 这些旗标用于指定目标处理器的体系结构和ABI(Application Binary Interface),以便生成针对特定体系结构和ABI的代码。

  14. -mloongsonsx 和 -mloongson-asx、-msimd=lasx、: 这个旗标是特定于目标架构的扩展选项,它启用了龙架构的SIMD(Single Instruction, Multiple Data)优化。

  15. -march=x86-64: 这个旗标指定目标体系结构为x86-64,即64位x86处理器架构,也称为AMD64或Intel 64。

  16. -mtune=core-avx2: 这个旗标告诉编译器生成针对特定处理器微体系结构的代码。在这种情况下,它针对支持AVX2指令集的处理器进行优化。

  17. -march=la664 和 -mtune=la664: 这些旗标指定了目标处理器架构为la664的架构和微体系结构,以便生成针对这些处理器优化的代码。

  18. -march=alderlake 和 -mtune=alderlake : 这些旗标指定了目标处理器架构为alderlake 的架构和微体系结构,以便生成针对这些处理器优化的代码。

  19. -mcond-move-int:这个旗标用于启用条件移动(conditional move)的整数优化。条件移动是一种在条件为真或假时选择两个不同的值而无需使用分支指令的优化技术。通常,这在条件分支语句(如if语句)中使用,以减少分支预测错误的可能性和优化性能。启用此标志后,编译器会尝试将条件分支转换为条件移动指令,从而提高代码的执行速度。

  20. -mforce-drap:这个旗标用于强制使用延迟分支风格的代码生成。条件分支指令的执行结果不会立即影响程序计数器(PC)。使用此标志可以告诉编译器生成适用于延迟分支的代码,以确保正确执行。

  21. -mvecarg:这个旗标用于指定矢量寄存器参数传递的约定,以便与目标架构和编译器期望的调用约定相匹配。在一些处理器架构中,特别是支持SIMD(Single Instruction, Multiple Data)指令的架构,函数参数可以通过矢量寄存器传递,以便进行高效的矢量化计算。


Test1 无指定架构优化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 含特殊优化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



优化增益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都倾向于采用较大规模的ALU,较大的一级缓存,以及激进的SIMD指令优化策略,重视通过编译器优化来改进处理器的每周期指令与数据的吞吐量,通过每周期吞吐更多、更密集的SIMD指令来减少分支预测错误带来的惩罚,这让它在编译器上具有非常高的改进空间,但这会导致部分SPEC项目的成绩对内存性能和缓存性能非常敏感。

同时我们注意到,LA664的硬件指令预取调度器似乎仍然无法很好工作,它主要通过编译器进行调度指令预取比其它微架构的硬件预取器更有效果,但这让它失去了很好的通用性。

我们发现guee的测试中龙芯SPECCPU2006 成绩高很大一部分是因为它采用针对GS464V、LA664架构的编译选项,并开启了SIMD向量化并行等一系列优化选项。从而能高效地从大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大幅度优化了缓存性能,内存控制器从DDR4-2400升级到DDR4-3200,三级缓存翻倍,内存带宽提高了约1.5倍,缓存带宽和延迟也改进了许多,而且龙架构相比MIPS架构优化了一些不常用指令,使平均指令密度提高了约7%,这让3A5000的IPC在编译器、架构指令密度和缓存性能的改进下提高了很多。

同样采用-mtune=alderlake旗标进行针对性优化的Zen3也可以做到与同样的性能增益幅度,当然英特尔12、13、14代处理器同样也可以。

从微架构设计上来看,LA664与Zen3、LX910/LX920基本处于同一个水平,它们的各项硬件堆料相近。

此次测试因为龙芯送测时间有限和华为突然开售的原因,我们没有办法使用华为的闭源编译器来使用 类似于-mtune=LX920的旗标,从而导致无法了解针对性优化后的性能,但我们通过guee开源的flag,了解到使用了龙芯系统默认提供的GCC8.3闭源编译器存在针对LA664架构的优化选项,但我们寻找GCC的提交记录没有找到关于-mtune=LA664的优化旗标,但相信随着龙芯编译器代码的完善,可以在GCC主线中看到-mtune=LA664的旗标。

LoongArch:使用 -mtune 设置函数和标签的默认对齐方式

LA464 微架构对代码对齐很敏感。龙芯团队对各种功能组合进行了对标, 结果 [1] 显示 16 字节标签与 32 字节标签对齐 函数对齐在 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

发布一条带图评论吧


3 条评论

默认

最新

常成

有3a6000的 spec2017 rate 1成绩么?

09-09 · IP 属地湖南

Chen

另外,3A6000的微架构里,ALU 和 FPU 和 AGU 应该都是四个,来源是 龙芯中科(688047) 投资者互动_F10_同花顺金融服务网在 6 月 19 号的回复:“目前,龙芯3A6000中使用的六发射处理器核LA664的深度(如ROB项数达到256项)、宽度(如四定点、四浮点、四访存共12个功能部件)都不是瓶颈”

昨天 01:34 · IP 属地北京

Chen

Loongnix 的 GCC 8.3.0 其实是开源的,可以从源里面下载源码(pkg.loongnix.cn/loongni),但里面是一堆 patch,很多修改没有贡献到上游。

昨天 01:31 · IP 属地北京


【转】华为 VS 龙芯 国产CPU架构初步探测、对比与分析的评论 (共 条)

分享到微博请遵守国家法律