#parallel #thread #performance

rayon-wasm

为Rust提供的简单工作窃取并行主义

1个稳定版本

1.6.2 2023年2月25日

#397并发

MIT/Apache

1MB
22K SLoC

Rayon

Rayon crate Rayon documentation minimum rustc 1.56 build status Join the chat at https://gitter.im/rayon-rs/Lobby

Rayon是Rust的数据并行库。它非常轻量级,可以轻松地将顺序计算转换为并行计算。它还保证了数据竞争自由。(您也可以享受这篇关于Rayon的博客,其中提供了更多关于其工作方式和细节的背景信息,或者这个视频,来自Rust Belt Rust会议。)Rayon可在crates.io上使用,并且API文档可在docs.rs上找到

并行迭代器等

Rayon使将顺序迭代器转换为并行迭代器变得易如反掌:通常,您只需将您的 foo.iter() 调用更改为 foo.par_iter(),Rayon就会完成剩余的工作

use rayon::prelude::*;
fn sum_of_squares(input: &[i32]) -> i32 {
    input.par_iter() // <-- just change that!
         .map(|&i| i * i)
         .sum()
}

并行迭代器 会负责决定如何将您的数据划分为任务;它会动态适应以获得最佳性能。如果您需要比这更多的灵活性,Rayon还提供了 joinscope 函数,这些函数允许您自己创建并行任务。为了获得更多控制,您可以创建 自定义线程池 而不是使用Rayon的默认全局线程池。

无数据竞争

您可能听说过并行执行可能会产生各种怪异的错误。但是,请放心。Rayon的所有API都保证了 数据竞争自由,这通常排除了大多数并行错误(尽管不是所有)。换句话说,如果您的代码可以编译,它通常与之前执行的操作相同。

对于并行迭代器来说,它们保证产生与它们的顺序对应物相同的结果。一个注意事项:如果您的迭代器有副作用(例如,通过 Rust通道 将方法发送到其他线程或写入磁盘),这些副作用可能以不同的顺序发生。请注意,在某些情况下,并行迭代器还提供了可以提供更高性能的顺序迭代器方法的替代版本。

使用Rayon

Rayon 在 crates.io 上可用。[Rayon] 的推荐使用方法是将其添加到您的 Cargo.toml 文件中,例如:

[dependencies]
rayon = "1.6"

要使用并行迭代器 API,需要将一些特质引入作用域。将这些东西引入作用域的最简单方法是使用 [Rayon 预言]。在您想要使用并行迭代器 API 的每个模块中,只需添加:

use rayon::prelude::*;

Rayon 当前需要 rustc 1.56.0 或更高版本。

与 WebAssembly 的使用

Rayon 可以通过 WebAssembly 在 Web 上运行,但需要适配器和一些项目配置来处理 WebAssembly 线程与其他平台线程之间的差异。

有关更多详细信息,请参阅 [wasm-bindgen-rayon] 文档。

贡献

Rayon 是一个开源项目!如果您想为 Rayon 贡献,请查看 [“需要帮助”问题列表]。这些都是(或应该是)适合入门的问题,通常包括详细的操作说明。如有任何疑问,请提出问题!另外,请查看维基页上的 [开发指南]。请注意,提交给 Rayon 的所有代码都假定在 [Rayon 的双 MIT/Apache 2.0 许可] 下发布。

快速演示

要查看 Rayon 的实际应用,请查看 rayon-demo 目录,其中包含使用 Rayon 的多个代码演示。例如,运行此命令以获得 N 体模拟的可视化。要查看使用 Rayon 的效果,按 s 顺序运行,按 p 并行运行。

> cd rayon-demo
> cargo run --release -- nbody visualize

有关演示的更多信息,请尝试

> cd rayon-demo
> cargo run --release -- --help

还有其他问题吗?

请参阅 [Rayon 常见问题解答]

许可证

Rayon 在 MIT 许可证和 Apache 许可证(版本 2.0)的条款下分发。有关详细信息,请参阅 [LICENSE-APACHE] 和 [LICENSE-MIT]。打开拉取请求被视为表示同意这些许可条款。

依赖关系

~685KB
~11K SLoC