在 ARM 上用 SVE2 的 match 指令加速 JSON 解析
来源: lemire.me — 2026-09-18
概述
Daniel Lemire 检验了他在四月提出的猜想:ARM 的 SVE2 match 指令是不是匹配字符的最快方式。ARM 工程师 Madhurendra Purbay 向 simdjson 提交了拉取请求,把原本用 NEON 表查找、每 16 字节要四条指令的结构字符分类器,换成一条 match 指令。在 22 个标准 JSON 文件、约 24MB 语料上,匹配分类器让索引阶段在 Graviton 4 上提速 3% 到 9%,整份解析提速 2% 到 4%(Graviton 5 上分别为 1% 到 2%)。代价是必须编译期启用 SVE2:Apple 芯片与较老的 Graviton 都不支持,只能回退到 NEON。
核心要点
- 原来的 NEON 分类器对每 16 字节要做加法、右移、表查找、比较四条指令;SVE2 的 match 把这一步压缩成一条。
- 索引阶段实测从 4.8 GB/s 升到 5.3 GB/s(Graviton 4 + clang),Graviton 5 上从 6.3 GB/s 升到 6.6 GB/s。
- 整份解析只涨 2% 到 4%(Graviton 4)与 1% 到 2%(Graviton 5),因为解析的第二阶段完全没动。
- 瓶颈不在指令本身而在取谓词:SVE 没有廉价办法把谓词搬到通用寄存器,只能先用受谓词控制的选择把它具体化成字节。
- Graviton 3 有 SVE 却没有 SVE2,跑不了这段代码;Apple 芯片至今也没采用 SVE,所以 simdjson 仍需保留 NEON 回退路径。
- 目前的代码只在 -mcpu=native 之类的构建下才会编译进来,下一步是像 x64 那样做运行时分派,让默认构建也能在支持的芯片上启用。
金句
这是一次幅度不大的提升,但它来自把一条已经精心调优过的例程里的四条 NEON 指令换成一条。
👍 0
👎 0
← 返回 Lobsters 首页