中国CPU实力如何?龙芯3A6000基准测试深度解析
我维护着几个广泛使用的库,这些库会根据使用的具体处理器提供优化代码路径。近年来我们开始支持龙芯处理器,但直到现在我才获得一台龙芯设备。据我所知,龙芯处理器在北美并不常见,这让我很难进行性能调优。幸运的是,龙芯爱好者社区的友好人士帮助我获得了一台搭载龙芯处理器的小型电脑。
据我了解,龙芯处理器的目的是减少中国对x64和ARM等架构的依赖。它们使用自研的专有架构——LoongArch。这些处理器拥有两代为并行处理设计的SIMD(单指令多数据)向量扩展:LSX和LASX。LSX(龙芯SIMD扩展)提供128位宽的向量寄存器和指令,大致与ARM NEON或早期x64 SSE扩展相当。LASX(龙芯高级SIMD扩展)首次出现在龙芯3A5000(2021年)中,是256位的后继版本,与大多数x64(Intel和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例程快……这可能表明我们的优化工作有待改进。
我决定运行一些测试,看看这款中国处理器与相对较新的Intel处理器(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每个周期执行的指令数与Intel处理器大致相当。然而,它需要更多指令,且时钟频率更低。因此,Intel处理器在这一轮胜出。
如果我们将fast_float函数替换为abseil的数字解析函数(来自Google),我得到的结果是两款处理器基本相当,除了时钟频率差异:
| 处理器 | 指令数/浮点数 | 指令/周期 | 主频(GHz) |
|---|---|---|---|
| Loongson-3A6000 | 562 | 4.42 | 2.50 |
| Xeon Gold 6338 | 571 | 5.08 | 3.19 |
Intel仍然凭借更高的频率获胜,但优势较小。
我想在SIMD密集型任务上测试龙芯处理器。因此,我使用simdutf库进行一些字符串转码:
|
|
我的结果如下,取决于使用的指令集。Intel处理器有三种选项(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的结论是:“龙芯的工程师有很多值得自豪的地方”:我同意这一看法。