Fearless SIMD v1.0:让 Rust 告别 unsafe

Fearless SIMD v1.0 正式发布,彻底改变了 Rust 中 SIMD 编程需要大量 unsafe 代码的现状。该项目历经 8 年打磨,通过 kernel! 宏和 safe transmute 模块,在确保内存安全的前提下,实现了高性能的跨平台 SIMD 抽象。无论是自动向量化、多版本函数,还是对硬件原生指令的安全访问,Fearless SIMD 都能提供一流的性能表现,且没有性能天花板。目前已有 30 多个直接依赖库和超过一千个间接依赖库采用,成为 Rust 生态中不可或缺的基础设施。

只要这两个小型、自包含的构建块是内存安全的,整个代码库就保证是内存安全的。
  1. O3marchnative

    这真是太棒了。Fearless SIMD 终于让我的 FFT 库 PhastFT 能在 Rust stable 上运行了 [0]。此前 PhastFT 依赖 Rust 的 std::simd(以及 multiversion),但这仍然需要 nightly 版本 [1]。

    v1.0 版本的主要贡献者之一,最初是帮我评估 PhastFT 可用的 portable SIMD 库。当我们决定采用 fearless_simd 后,他将 PhastFT 从 std::simd 迁移到了 fearless_simd。不过我们发现,当时 fearless_simd 提供的功能还不够用。于是,他开始为 fearless_simd 做出大量贡献。看到通过一个业余开源项目的工作能切实改善 Rust 生态系统,真的非常有成就感。

    [0] https://github.com/smu160/PhastFT

    [1] https://doc.rust-lang.org/std/simd/index.html

  2. modulovalue

    我目前正在为 Dart 添加更好的 SIMD 支持(https://github.com/dart-lang/sdk/issues/64170),想向作者或这里的其他人请教一个问题。

    Rust 或其他语言是否支持自定义编译器,以便过程间分析(interprocedural analyses)能追踪例如 double 类型的自定义子集,从而让编译器选择最高效的指令序列,比如针对 min/max 操作?如果我们知道一个 double 永远不会是 NaN,那么在 x86 上只需生成一条指令,而在 arm64 上则需多生成一条。如果我们知道一个 double 既不为零也不是 NaN,那么在两种架构上都只需生成一条指令。

    关于 relaxed SIMD 和 deterministic SIMD 的整个讨论之所以存在,似乎仅仅是因为我们的编译器不够智能,和/或它们的整体程序分析不支持任何插件式能力。

    还有其他例子:如果我们知道 SIMD 位掩码是规范的(每个 lane 全为 1),那么我们可以更高效地实现水平归约(horizontal reductions)。这非常小众,我怀疑没有任何语言支持如此丰富的领域进行过程间分析,这感觉像是编程语言领域的一个缺失。

  3. antimora

    如果你还需要 f16 支持,还有这个:https://github.com/wingertge/macerator

  4. skavi

    有人能对比一下这个库的设计与 https://github.com/google/highway 吗?

  5. dang

    相关讨论。还有其他的吗?

    Towards fearless SIMD, 7 years later - https://news.ycombinator.com/item?id=43519823 - 2025 年 3 月(175 条评论)

    Towards fearless SIMD - https://news.ycombinator.com/item?id=18293209 - 2018 年 10 月(81 条评论)

同日更多故事

2026-09-24