< 返回版块

苦瓜小仔 发表于 2025-08-21 13:37

Tags:日报

文章《使用纯 Rust 实现 SIMD 加速算法(ChaCha20 / ChaCha12)的经验教训》

作者用 2 天时间把 ChaCha20 / ChaCha12 的纯 Rust 实现提速到接近手写汇编水平,同时保持可读、可审计、安全。

  1. SIMD 三步曲
    load → compute → store。先批量加载数据到向量寄存器,再做并行运算,最后一次性写回内存。注意寄存器数量有限(如 NEON 32×128bit),尽量把数据留在寄存器里。

  2. 两种加速思路
    • 算法本身并行化(复杂)。
    • 把输入切成 N 个块,用 N 条 SIMD 通道并行跑(通用且易实现)。
    ChaCha 每 64 B 一个块,256-bit AVX2 可一次跑 8 块;BLAKE3 在 AVX-512 上需 ≥16 KiB 输入才能跑满单核。

  3. 选指令集
    服务器直接上 AVX-512;消费级机器优先 AVX2 + NEON;SSE2 已过时。Rust 可通过 is_x86_feature_detected! 做运行时检测,也可 #[cfg(target_feature)] 编译时裁剪;推荐默认 runtime,用 feature 让用户切 compile-time。

  4. 实现方式对比
    • nightly 的 portable_simd:跨平台、无依赖,未来最香。
    wide crate:stable 可用,最大 256-bit,依赖稍多。
    pulp:高层抽象,依赖大,暂不支持 no_std。
    std::arch 原始 intrinsic:无依赖、稳定,但代码重复多,作者最终选它。

  5. 编译器自动向量化
    对简单批量操作(如 XOR 两块内存),手写循环即可,LLVM 通常会自动向量化;除非 profiler 证明瓶颈,否则不必手动写 intrinsics。

  6. 测试技巧
    RUSTFLAGS="-C target-feature=±avx2,±avx512f" 组合跑多套测试;GitHub Actions 暂不支持 AVX-512,需本地跑。

  7. 可移植的未来
    nightly 的 portable_simd 将允许一次写 u32x4,编译器自动映射到 SSE2/NEON/simd128 等,显著降低维护量,作者强烈期待其稳定。

Rust 已能在不牺牲安全性的前提下,用极少量代码获得接近汇编的 SIMD 性能,是加密库摆脱 C/汇编的最佳路径。

仓库:https://github.com/bloom42/chacha12-blake3

阅读:https://kerkour.com/rust-simd

Reddit:https://www.reddit.com/r/rust/comments/1mqo2ap/lessons_learned_from_implementing_simdaccelerated/

What the Fork:实时构建可视化工具

作者开发了一个名为 What the Fork 的跨平台实时构建可视化工具,用于分析和优化软件构建过程。

该工具通过监听系统调用(如 forkexecexit)来追踪构建过程中每个进程的启动和结束,从而生成构建的实时可视化界面。

它支持多种构建系统和编程语言,能够帮助开发者发现构建过程中的问题,例如未充分利用多核 CPU 的并行编译问题、不必要的重复检查以及构建工具的低效调度等。

通过可视化,开发者可以直观地看到构建过程中的瓶颈,并针对性地进行优化。

阅读:https://danielchasehooper.com/posts/syscall-build-snooping/

Reddit:https://www.reddit.com/r/rust/comments/1mt4i0s/making_a_realtime_build_visualizer_for_compiled/

讨论:Nom 是解析复杂语法的好选择吗?

“我用过它,但它是一个解析器组合器库,所以也有一些其他解析器组合器库的缺点。话虽如此,它在按其自身方式完成工作方面还是非常出色的。根据你的使用场景(预定义的、知名的、中小型复杂度的语言 vs 仍在定义中的、大型的、复杂的、相互关联的语言),它可能正合你意。

也就是说,组合器库的主要问题是,解析器的结构连接必须按照 nom 所希望的方式进行组合,因此你需要学习“nom 方式”,而这感觉就像在使用一种完全不同的语言。此外,错误、警告以及“一遇到问题就放弃”也是组合器库存在的问题。

几乎每种语言都会开发一个自定义的词法分析器/解析器,而不是使用解析器生成器/标准词法分析/解析库,这其中是有原因的。极端情况很棘手。”

Reddit:https://www.reddit.com/r/rust/comments/1mt1kf1/is_the_nom_crate_a_good_option_for_parsing_a/

--

From 日报小组 苦瓜小仔

社区学习交流平台订阅:

评论区

写评论

还没有评论

1 共 0 条评论, 1 页