如何更改 Rayon 使用的线程数?

asy*_*har 4 concurrency multithreading rust rust-cargo rayon

我正在使用 Rayon 库:

extern crate rayon;

const N: usize = 1_000_000_000;
const W: f64 = 1f64/(N as f64);

fn f(x: f64) -> f64 {
    4.0/(1.0+x*x)
}

fn main() { 
    use rayon::prelude::*;
    let sum : f64 = (0..N)
        .into_par_iter()
        .map(|i| f(W*((i as f64)+0.5)))
        .sum::<f64>();
    println!("pi = {}", W*sum);
}
Run Code Online (Sandbox Code Playgroud)

我想使用不同数量的线程运行此代码:1、2、3 和 4。

我已阅读有关Rayon 会生成多少个线程的文档其中说:

默认情况下,Rayon 使用与可用 CPU 数量相同的线程数。请注意,在启用超线程的系统上,这等于逻辑内核的数量,而不是物理内核的数量。

如果要更改生成的线程数,可以将环境变量RAYON_NUM_THREADS设置为所需的线程数或使用ThreadPoolBuilder::build_globalfunction方法。

但是,步骤对我来说不清楚。如何在我的 Windows 10 PC 上执行此操作?

asy*_*har 6

只需包含在 fn main() 中。num_threads 接受线程数。

rayon::ThreadPoolBuilder::new().num_threads(4).build_global().unwrap();


Car*_*arl 5

如果您不想设置全局,您可以创建一个名为“create_pool”的函数。该辅助函数根据 num_threads 构造一个 Rayon ThreadPool 对象。

pub fn create_pool(num_threads: usize) -> Result<rayon::ThreadPool, YOURERRORENUM> {
   match rayon::ThreadPoolBuilder::new()
      .num_threads(num_threads)
      .build()
   {
      Err(e) => Err(e.into()),
      Ok(pool) => Ok(pool),
   }
}
Run Code Online (Sandbox Code Playgroud)

然后从这个 create_pool 内部调用您的代码。这会将所有 Rayon 函数限制为您设置的 num_threads。

[...]
    create_pool(num_threads)?.install(|| {
       YOURCODE
     })?;
[...]
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请参阅https://towardsdatascience.com/nine-rules-for-writing-python-extensions-in-rust-d35ea3a4ec29