2026 年 Rust 的 SIMD 现状
来源: shnatsel.github.io — 2026-09
概述
Sergey Davidoff 发布了新一年度的 Rust SIMD 生态调查。今年他自己成了 fearless_simd 的维护者,为避免利益冲突请来了 std::simd、wide、pulp、macerator 的作者审阅草稿。文章从「为什么要 SIMD」讲起:算术单元很便宜,但指令解码是瓶颈,所以一次喂一批数据能显著提速。随后逐个评估三条路线——自动向量化、可移植 SIMD 抽象、平台专有 intrinsics,并给出各 crate 的多版本化、定宽/硬件宽度向量、元素与宽度泛化、三角函数等维度的对比。
核心要点
- SIMD 的动机是算术硬件长期被低估:单条指令处理一批数据,x86 上 512 位向量理论上能带来 f64 的 8 倍或 u8 的 64 倍 加速。
- ARM 强制要求 64 位 CPU 支持 NEON,WebAssembly 有自己的 128 位打包 SIMD 扩展,而 x86 则堆了一长串扩展,导致「这颗 CPU 到底有没有这条指令」成为难题。
- 对分发二进制的项目,解法是函数多版本化:为不同 SIMD 扩展各编译一份,运行时探测 CPU 特性再选版本。
- 自动向量化最省事但最不可靠:函数越复杂越难被向量化,性能还会随编译器版本与周边代码波动,浮点还需要 Rust 1.98 稳定下来的 algebraic_add() 一类语义。
- multiversion crate 只需一个注解,但有隐性代价:被标注的函数本身很小时,几行探测代码就会成为可观开销。
- 可移植抽象的几个关键能力是定宽向量、硬件宽度向量、对元素类型与向量宽度泛化,以及安全访问 intrinsics。
- 对比表中 std::simd 灵活但仅限 nightly 且 API 偶有破坏性变更,fearless_simd 是全绿的一体化方案并已发布 1.0,wide 平台覆盖广但与多版本化根本冲突。
- pulp 主要为线性代数库 faer 服务,操作偏数学、API 面向原生宽度向量;macerator 与它同源,为 burn 的 CPU 后端而生。
- 作者点出的最大缺口是三角函数:std::simd 上只有一个「略有问题」的 sleef 移植,fearless_simd 上则还没有对应移植。
金句
以 SIMD 的幌子塞进标量实现,是这里最不可饶恕的原罪。
👍 0
👎 0
← 返回 Lobsters 首页