中国CPU性能如何?龙芯3A6000基准测试
我维护着一些广泛使用的库,这些库根据所使用的特定处理器提供了优化的代码路径。近年来,我们开始支持龙芯处理器,但直到现在我才接触到龙芯处理器。据我所知,它们在北美地区并不广泛流通。这使得我很难进行任何性能调优。幸运的是,龙芯爱好者社区的友好人士帮助我获得了一台搭载龙芯处理器的小型电脑。
我的理解是,龙芯处理器旨在减少中国对x64和ARM等架构的依赖。它们使用自己专有的架构,称为LoongArch。这些处理器拥有两代为并行处理设计的SIMD(单指令多数据)向量扩展:LSX和LASX。LSX(龙芯SIMD扩展)提供128位宽的向量寄存器和指令,大致可与ARM NEON或早期的x64 SSE扩展相媲美。LASX(龙芯高级SIMD扩展)首次出现在龙芯3A5000(2021年),是256位的后继者,与大多数x64(英特尔和AMD)处理器中的x64 AVX/AVX2有一定的可比性。
LoongArch架构尚未得到普遍支持。你可以运行大多数Linux(Debian)系统,但Visual Studio Code无法通过SSH连接到LoongArch系统,尽管在VSCodium中有社区支持。然而,新版本的GCC和LLVM编译器支持LoongArch。
我的龙芯3A6000处理器支持LASX和LSX。但是,我不知道如何在LoongArch下进行运行时分发:在程序运行时检查是否支持LASX并动态切换到LASX支持。我可以强制编译器使用LASX(通过使用-march=native编译),但我早期的实验表明,LASX例程并不比LSX例程快……这可能是我们优化不足的一个迹象。
我决定运行一些测试,看看这款中国处理器与相对较新的英特尔处理器(Ice Lake)相比如何。这个比较并不是为了追求公平。Ice Lake处理器虽然有些旧,但它是一款昂贵的服务器级处理器。此外,我使用的代码很可能针对x64处理器的优化程度远高于对龙芯处理器的优化。我也不是要做一个详尽的测试:我只是想有个大致的了解。
让我们首先考虑数字解析。我的测试是可重复的。
|
|
这将解析随机数字。我关注fast_float的结果。我在两个实例中都使用GCC 15。
| 处理器 | 指令数/浮点数 | 指令/周期 | GHz |
|---|---|---|---|
| Loongson-3A6000 | 377 | 4.92 | 2.50 |
| Xeon Gold 6338 | 295 | 5.07 | 3.19 |
因此,龙芯3A6000每个周期执行的指令数与英特尔处理器大致相当。然而,它需要更多的指令,并且其时钟频率更低。所以英特尔处理器在这一轮胜出。
如果我们用abseil的数字解析函数(来自谷歌)替换fast_float函数会怎样?我得到的结果是,除了时钟频率外,两款处理器基本相当。
| 处理器 | 指令数/浮点数 | 指令/周期 | GHz |
|---|---|---|---|
| Loongson-3A6000 | 562 | 4.42 | 2.50 |
| Xeon Gold 6338 | 571 | 5.08 | 3.19 |
英特尔仍然凭借更高的频率获胜,但优势较小。
我想在SIMD密集型任务上测试龙芯处理器。所以我使用simdutf库进行一些字符串转码。
|
|
我的结果如下,取决于使用了哪些指令。英特尔处理器有三种选项(128位SSSE3、256位AVX2和512位AVX-512),而龙芯处理器有两种选项(128位LSX和256位LASX)。
| 处理器 | 指令数/字节 | 指令/周期 | GHz |
|---|---|---|---|
| Loongson-3A6000 (LSX) | 0.562 | 2.633 | 2.50 |
| Loongson-3A6000 (LASX) | 0.390 | 1.549 | 2.50 |
| Xeon Gold 6338 (SSSE3) | 0.617 | 5.07 | 3.236 |
| Xeon Gold 6338 (AVX2) | 0.364 | 2.625 | 3.19 |
| Xeon Gold 6338 (AVX-512) | 0.271 | 1.657 | 3.127 |
总的来说,我认为这些结果对于龙芯处理器来说相当不错。
Chips and Cheese网站有一篇更广泛的评测。他们将这款中国处理器的单核性能定位在初代AMD Zen处理器和AMD Zen 2处理器之间。AMD Zen 2处理器是当前游戏机(如PlayStation 5)的核心。Chips and Cheese的结论是“龙芯的工程师有很多值得骄傲的地方”:我同意。