Fearless SIMD v1.0 已发布

Lobsters Hottest 工具

摘要

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,即使内部也安全

Lobsters Hottest

Rust 的 SIMD 抽象现在允许在不使用 unsafe 代码的情况下安全使用,这得益于 Rust 1.87 引入的 CPU 特性令牌,从而实现了简洁且可移植的向量操作。

Rust SIMD on the GPU

Hacker News Top

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.