
我维护着一些广泛使用的库,这些库的代码路径会根据所使用的特定处理器进行优化。近年来,我们开始支持龙芯处理器,但我直到现在才有机会接触到龙芯处理器。据我所知,龙芯处理器在北美并不普及。这使得我很难进行任何性能调优。幸运的是,龙芯爱好者社区的热心人士帮助我获得了一台搭载龙芯处理器的小型计算机。
我的理解是,龙芯处理器旨在降低中国对 x64 和 ARM 等架构的依赖。它们采用自主研发的 LoongArch 架构。这些处理器拥有两代专为并行处理设计的 SIMD(单指令多数据流)向量扩展:LSX 和 LASX。LSX(龙芯 SIMD 扩展)提供 128 位宽的向量寄存器和指令,大致相当于 ARM NEON 或早期 x64 SSE 扩展。LASX(龙芯高级 SIMD 扩展)首次应用于龙芯 3A6000(2023 年),是其 256 位扩展,与大多数 x64(Intel 和 AMD)处理器中使用的 x64 AVX/AVX2 指令集具有一定的可比性。
LoongArch架构目前尚未得到普遍支持。虽然大部分Linux发行版(例如Debian)都可以运行LoongArch,但我很难找到neovim的二进制文件,而且Visual Studio Code也无法通过SSH连接到LoongArch系统。幸好我精通vi编辑器。不过,最新版本的GCC和LLVM编译器都支持LoongArch。
我的龙信3A6000处理器同时支持LASX和LSX。然而,我不知道如何在LoongArch下进行运行时调度:即在程序运行时检查是否支持LASX,并动态地启用LASX支持。我可以强制编译器使用LASX(通过编译时使用-march=native参数),但我的初步实验表明,LASX例程的速度并不比LSX例程快……这可能是我们优化不足的迹象。
我决定做一些测试,看看这款国产处理器与相对较新的英特尔处理器(Ice Lake)相比如何。这个比较并不完全公平。Ice Lake 处理器虽然年代久远,但它是一款价格昂贵的服务器级处理器。此外,我使用的代码很可能是针对 x64 处理器而非龙芯处理器进行优化的。我也不打算进行全面的测试,只是想大致了解一下。
我们首先考虑数字解析。我的测试是可复现的。
git clone https : //github.com/lemire/simple_fastfloat_benchmark.git cd simple_fastfloat_benchmark cmake - B build cmake -- build build . / build / benchmarks / benchmark # use sudo for perf counters这将解析随机数。我主要关注 fast_float 的结果。两种情况下我都使用 GCC 15。git clone https : //github.com/lemire/simple_fastfloat_benchmark.git cd simple_fastfloat_benchmark cmake - B build cmake -- build build . / build / benchmarks / benchmark # use sudo for perf counters
| 处理器 | 指令/浮点 | 插入/循环 | 千兆赫 |
|---|---|---|---|
| 龙信-3A6000 | 377 | 4.92 | 2.50 |
| Xeon Gold 6338 | 295 | 5.07 | 3.19 |
因此,龙芯3A6000每个时钟周期执行的指令数与英特尔处理器大致相同。然而,它需要更多的指令,而且时钟频率更低。所以,英特尔处理器在这一轮胜出。
如果我们用 abseil 的数字解析函数(来自 Google)替换 fast_float 函数会怎样?我知道除了时钟频率之外,这两个处理器其他方面完全可以比较。
| 处理器 | 指令/浮点 | 插入/循环 | 千兆赫 |
|---|---|---|---|
| 龙信-3A6000 | 562 | 4.42 | 2.50 |
| Xeon Gold 6338 | 571 | 5.08 | 3.19 |
英特尔凭借更高的频率仍然胜出,但优势较小。
我想测试龙芯处理器在SIMD密集型任务上的性能。所以我使用
使用 simdutf 库进行一些字符串转码。
git clone https://github.com/simdutf/simdutf/git cd simdutf cmake -B build -D SIMDUTF_BENCHMARKS=ON cmake --build build --target benchmark ./build/benchmarks/benchmark -P utf8_to_utf16le -F README.md # use sudo for perf counters根据所遵循的指令,我的结果如下。git clone https://github.com/simdutf/simdutf/git cd simdutf cmake -B build -D SIMDUTF_BENCHMARKS=ON cmake --build build --target benchmark ./build/benchmarks/benchmark -P utf8_to_utf16le -F README.md # use sudo for perf counters
正在使用。英特尔处理器有三种选项(128 位带 SSSE3,
256 位(AVX2)和 512 位(AVX-512)处理器,而龙芯处理器
有两种选择(128 位 LSX 和 256 位 LASX)。
| 处理器 | 字节/字节 | 插入/循环 | 千兆赫 |
|---|---|---|---|
| 龙信-3A6000 (LSX) | 0.562 | 2.633 | 2.50 |
| 龙信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 |
粗略地说,龙信处理器转码一个简单的 ASCII 文件(README.md 文件)的速度为 10 GB/s,而英特尔处理器转码的速度略高于 20 GB/s。
总的来说,我认为龙芯处理器的这些结果相当不错。
Chips and Cheese 的评测更为详尽。他们认为,就单核心性能而言,这款中国产处理器介于第一代 AMD Zen 处理器和 AMD Zen 2 处理器之间。AMD Zen 2 处理器目前用于 PlayStation 5 等游戏主机。Chips and Cheese 的结论是:“龙芯的工程师们有很多值得骄傲的地方”:我同意。
原文: https://lemire.me/blog/2025/11/23/how-good-are-chinese-cpus-benchmarking-the-loongson-3a6000/