Fearless SIMD v1.0 已发布
摘要
Fearless SIMD v1.0 正式发布,为Rust提供安全且高性能的SIMD抽象,最小化不安全代码,同时提供可移植操作和平台内部函数。
<p><a href="https://lobste.rs/s/wx3qsm/fearless_simd_v1_0_is_here">评论</a></p>
查看缓存全文
缓存时间: 2026/09/22 14:40
# 无畏 SIMD v1.0 正式发布
来源:https://linebender.org/blog/fearless-simd-1-0/
### Shnatsel,2026年9月22日
`fearless_simd`(https://crates.io/crates/fearless_simd)将`unsafe`从SIMD中移除。
自8年前的原始原型(https://raphlinus.github.io/rust/simd/2018/10/19/fearless-simd.html)以来,它已经走了很长的路。我们现在有信心,无论你需要什么——无论是仅自动向量化和多版本化,还是完整的可移植SIMD抽象,亦或是仅安全地访问内联函数——无畏SIMD都能很好地满足你的需求。
与其赘述更新日志(https://github.com/linebender/fearless_simd/blob/main/CHANGELOG.md),我更想借此机会反思无畏SIMD的目标、其实现方式,以及它与其他SIMD抽象的与众不同之处。
## 性能
可移植SIMD抽象常被批评性能不足,因此我们投入了大量精力确保无畏SIMD永远不会拖累你的性能。
例如,在为不同平台上有不同边缘行为的操作(如混洗(https://docs.rs/fearless_simd/latest/fearless_simd/trait.SimdBase.html#tymethod.swizzle_dyn)或浮点数最大值(https://docs.rs/fearless_simd/latest/fearless_simd/trait.SimdBase.html#tymethod.max))实现可移植抽象时,我们提供了两种变体:一种是所有平台上行为一致的精确变体;另一种是返回平台相关结果的快速变体,适用于你确信边缘情况不会发生的情况。
我们还让算法能够轻松地基于硬件的原生向量大小(https://github.com/linebender/fearless_simd/blob/main/fearless_simd/examples/sigmoid.rs)来表达SIMD操作,从而使你的代码无论运行在何处,都能充分利用硬件性能。我们也支持固定向量大小,以满足某些算法的需求。
我们同样投入大量精力确保可移植SIMD操作的实现达到最先进的水平,甚至向Rust(https://shnatsel.github.io/improving-std-simd-swizzle-dyn/)和LLVM(https://gist.github.com/valadaptive/e37cc66c721b987935ef4d74cab6f3d6)上游贡献了改进。
但是,如果你需要一个未被可移植抽象覆盖的指令,或者想要更底层的控制,你可以安全地降级到平台内联函数(https://github.com/linebender/fearless_simd/blob/main/fearless_simd/examples/srgb.rs),这部分代码不会带来额外开销,而其余部分则保持简洁和可移植。
得益于对内联函数的安全访问,性能*没有*上限。
## 安全性
如果你查阅任何其他SIMD抽象的源代码,你会发现其中充满了`unsafe`代码。类似`rg unsafe`的命令会找出数千个`unsafe`代码块。
但在无畏SIMD中并非如此!该crate经过精心设计,无需使用临时性的`unsafe`代码。
其中一个关键部分是`kernel!`宏(https://docs.rs/fearless_simd/latest/fearless_simd/macro.kernel.html),它利用编译器中的target feature v1.1(https://rust-lang.github.io/rfcs/2396-target-feature-1.1.html)来调用大多数SIMD内联函数,而无需`unsafe`。我在之前的博客文章(https://shnatsel.github.io/safe-simd-in-rust-even-on-the-inside/)中详细描述了这一设计,如果你想了解更多,请查看这篇文章。
这移除了大部分临时性的`unsafe`,但并未覆盖操作原始指针的SIMD加载/存储操作。这时,我们受`bytemuck`和`zerocopy`等crate启发而创建的(https://github.com/linebender/fearless_simd/blob/850adcae4996e6584fa77443a652c666f2aab126/fearless_simd/src/transmute.rs)安全转换模块就派上了用场。
像`\_mm\_loadu\_epi32`这样的SIMD内联函数看似特殊,但实际上在底层变成了普通的加载和存储操作。因此,你可以用一个单一的、可复用的封装器(https://github.com/linebender/fearless_simd/blob/850adcae4996e6584fa77443a652c666f2aab126/fearless_simd/src/transmute.rs#L252-L354)完全复制它们的功能。
得益于Rust类型系统的力量,我们只需要审计这两个小型、独立的构建块。只要它们是内存安全的,代码库的其余部分就保证也是内存安全的。
最终,Rust中的SIMD可以真正做到“无畏”。
## 易用性
函数多版本化是一个棘手的问题。
之前的解决方案要么[需要添加`\#\[inline\(always\)]`注解](https://shnatsel.github.io/safe-simd-in-rust-even-on-the-inside/)并理解其影响,要么在每个函数调用上施加少量开销(https://docs.rs/multiversion/0.9.0/multiversion/)。后者在大多数情况下是可行的,但在非常小的函数上会降低性能,并且仍然需要你有针对性地添加`\#\[inline\(always\)]`来规避这个问题。
两者都是有漏洞的抽象——你仍然需要思考底层发生了什么!
伴随`fearless_simd` v1.0,我们推出了`fearless_simd_macros` v0.1,它提供了一个无漏洞的抽象:`\#\[simd\]`宏。有了它,你完全不需要思考底层发生了什么!将其放在任何SIMD函数上,它就能直接工作。
话虽如此,尽管这对生态系统是一个巨大的进步,但仍然涉及一些样板代码(https://github.com/linebender/fearless_simd/tree/main/fearless_simd#portable-simd)。我们渴望进一步减少它,要么通过编译器支持,借助结构体目标特性RFC(https://github.com/rust-lang/rfcs/pull/3525)来完全移除`\#\[simd\]`注解,要么通过我们未来将探索的(https://github.com/linebender/fearless_simd/pull/375)其他技巧。
如果你不喜欢过程宏,旧的方式仍然可用,尽管没那么方便。
易用性是我们预计可能仍会发展的唯一方面。但这并不影响核心`fearless_simd`crate的稳定性保证,今天编写的代码,无论是否使用`\#\[simd\]`宏,都将无限期地继续工作。
## 稳定性
无畏SIMD将长期存在。我们将为v1.0及所有后续版本提供3年的安全更新(https://github.com/linebender/fearless_simd/blob/main/fearless_simd/SECURITY.md)。
虽然我们无法预知未来,但存在可行的路径来支持近期的Rust特性(如`f16`类型)和更长期的特性(如SVE(https://en.wikipedia.org/wiki/AArch64#Scalable_Vector_Extension_(SVE))和RISC-V向量扩展(https://rvv-isadoc.readthedocs.io/en/latest/index.html)),如果/当这些硬件扩展变得相关时,无需进行破坏API的更改。
## 与std::simd的关系
我们非常希望`std::simd`能稳定下来,但这不会使无畏SIMD过时。
Rust标准库只实现了必须包含在内的部分,其余部分(例如多版本化、硬件宽度向量)则留给生态系统crate来处理。
`fearless_simd`包含了一个在稳定版Rust上工作的、等效于`std::simd`的部分,但这只是一个更大整体中的一部分。
一旦`std::simd`稳定,我们将把无畏SIMD移植到它上面,以删除大量自定义代码并获得对各种冷门平台的支持。但对生态系统crate(如`fearless_simd`)的需求将继续存在。
## 采用情况
如果你的crate无人问津,那它再优秀也无关紧要。
无畏SIMd已经被(https://crates.io/crates/fearless_simd/reverse_dependencies)30个其他crate作为直接依赖使用,并且间接被超过一千个crate(https://lib.rs/crates/fearless_simd/rev)所依赖!
它已经支撑了Rust生态系统中相当一部分内容,我们希望v1.0能将其推向更远。
如果你想在你的项目中使用无畏SIMD,请查看文档(https://docs.rs/fearless_simd/latest/fearless_simd/)和示例(https://github.com/linebender/fearless_simd/tree/main/fearless_simd/examples),并随时在Zulip(https://xi.zulipchat.com/#narrow/channel/514230-simd)上提问!
相似文章
Rust 中的安全 SIMD,即使内部也安全
Rust 的 SIMD 抽象现在允许在不使用 unsafe 代码的情况下安全使用,这得益于 Rust 1.87 引入的 CPU 特性令牌,从而实现了简洁且可移植的向量操作。
fearless_simd v0.7:64位整数、改进的泛型、SSE2 及即将到来的 v1.0
fearless_simd v0.7 新增了 64 位整数支持、SSE2 级别、改进的泛型及更多操作,v1.0 即将发布。
Rust SIMD on the GPU
VectorWare announces that Rust's portable SIMD (core::simd) now works on the GPU, mapping SIMD vectors to warp lanes and enabling familiar Rust abstractions for GPU programming.
实现FMA并发现C和Rust标准库中的错误
作者为Rust的fearless_simd库实现了一个向量化FMA,从而提高了性能,并发现了Rust和musl libc标准库中的错误。
GPU上的无畏并发:在Rust中进行安全的GPU推理,与vLLM/SGLang竞争 [R]
cuTile Rust 引入了一种基于块(tile)的编程模型,利用 Rust 的所有权机制来保证 GPU 内核的内存安全和无数据竞争,基于该模型构建的 Grout 推理引擎在 Qwen3 模型上实现了与 vLLM/SGLang 相当的吞吐量。