今天的大多数系统都依赖 Unicode 字符串。但是,我们有两种流行的 Unicode 格式:UTF-8 和 UTF-16。我们经常需要从一种格式转换为另一种格式。例如,您可能有一个使用 UTF-16 格式化的数据库,但您需要使用 UTF-8 生成 JSON 文档。这种转换通常称为“转码”。
在过去的几年里,我们编写了一个专门处理 Unicode 字符串的库,重点是性能: simdutf 库。该库用于 JavaScript 运行时( Node JS和bun )。
simdutf 库能够受益于处理器上最新和最强大的指令。特别是,它与最新的带有 AVX-512 指令的处理器(Intel Ice Lake、Rocket Lake 以及 AMD Zen 4)配合得很好。
我还没有 Zen 4 处理器,但 Velu Erwan 足以为我进行基准测试。一个合理的任务是将阿拉伯语文件从 UTF-8 转码为 UTF-16:这通常是一项非常重要的任务,因为阿拉伯语 UTF-8 是一个字节和两个字节字符的混合,我们必须将它们转换为两个-字节 UTF-16 字符(带验证)。所需步骤(Linux下)如下:
git clone https://github.com/simdutf/simdutf && CD simdutf && cmake -B 构建 && cmake --build 构建 && wget https://cutt.ly/d2cIxRx && ./build/benchmarks/benchmark -F Arabic-Lipsum.utf8.txt -P convert_utf8
(理想情况下,以对性能计数器的特权访问权限运行最后一个命令。)
与 Intel 一样, AMD 也有自己的编译器。我无法访问 Intel 编译器进行测试,但 Velu 有 AMD 编译器。
一个明智的参考点是 iconv,因为它由运行时库提供。 AMD 处理器的运行速度比英特尔内核快得多(5.4 GHz 与 3.4 GHz)。我们使用 GCC 12。
转码器 | 英特尔冰湖 (GCC) | AMD 禅 4 (海湾合作委员会) | AMD Zen 4(AMD 编译器) |
---|---|---|---|
图标 | 0.70 GB/秒 | 0.97GB/秒 | 0.98 GB/秒 |
模拟器 | 7.8 GB/秒 | 11GB/秒 | 12GB/秒 |
乍一看,Zen 4 处理器在运行 simdutf AVX-512 代码时的每个周期效率略低(AMD 为 2.8 条指令/周期,而 Intel 为 3.1 条指令/周期)但请记住,我们没有在调整我们的代码时访问 Zen 4 处理器。效率差异足够小,我们可以大致认为处理器处于同等水平,等待进一步调查。
AMD Zen 4 以更高的频率运行的最大区别。如果我依靠维基百科,我认为没有可以匹配 5.4 GHz 的 Ice Lake 处理器。然而,一些 Rocket Lake 处理器接近。
在我们的基准测试中,我们跟踪 CPU 频率,并且在运行 AVX-512 时获得与运行常规代码 (iconv) 时相同的测量频率。因此 AVX-512 确实很有优势。
这些结果表明 AMD Zen 4 在 AVX-512 性能方面与 Intel Ice Lake 相当。鉴于 Zen 4 微架构是 AMD 首次尝试在商业上支持 AVX-512,这是一项了不起的壮举。
进一步阅读:解析 JSON 时的 AMD Zen 4 性能(phoronix.com)。
图片来源:Velu Erwan从 AMD France 获得了处理器。确切的规格是 AMD 7950X,2x16GB DDR5 4800MT 重新配置为 5600MT。
原文: https://lemire.me/blog/2023/01/05/transcoding-unicode-with-avx-512-amd-zen-4-vs-intel-ice-lake/