【问题标题】:Parallel initialisation of big memory block in RustRust 中大内存块的并行初始化
【发布时间】:2021-07-14 06:31:56
【问题描述】:

最好的方法是什么:

我有一个需要用一些数据初始化的 2GiB 内存块。 数据都是独立的,因此我可以轻松地生成 n 个线程来并行初始化数据,每个线程在单独的内存位置上工作。

我怎样才能“告诉”Rust。它不允许我在线程之间共享内存(有充分的理由和正当的)。我知道不会有竞争条件,因为每个线程都在完全独立的内存位置上工作。

一个想法是使用(横梁)通道。每个线程将计算发送给一个将内存放入正确位置的写入器。唉,这感觉过于复杂且不够高效。有没有办法为线程划分内存以确保使用不同的线程工作?

【问题讨论】:

标签: multithreading rust


【解决方案1】:

除了 kmdreko 推荐的优秀 Rayon crate 之外,还有一个更底层的能实现你想要的原语是slice::split_at_mut。您可以使用它将现有的可变切片拆分为多个可变切片,而无需使用不安全的代码:

let mut data = vec![0u8; 2_000_000]; // pretend this is 2 GiB
let mut data = &mut data[..];
let chunk_size = data.len() / n_threads;

for _ in 0..n_threads {
    let (chunk, rest) = data.split_at_mut(chunk_size);
    data = rest;
    spawn(move |_| {
        chunk.fill(1);
    });
}

但是,要使其工作,您需要 作用域 线程,即允许引用借用值的线程。 (这是合理的,因为作用域线程会自动加入所有创建的线程,从而保证没有线程比借用的值更长。)

这是一个示例,使用与 kmdreko 的答案类似的设置:

use crossbeam_utils::thread;

fn main() {
    let n_threads = 8;
    let mut data = vec![0u8; 2_000_000]; // pretend this is 2 GiB
    let mut data = &mut data[..];
    let chunk_size = data.len() / n_threads;
    thread::scope(|s| {
        for _ in 0..n_threads {
            let (chunk, rest) = data.split_at_mut(chunk_size);
            data = rest;
            s.spawn(move |_| {
                chunk.fill(1);
            });
        }
    })
    .unwrap();
}

Playground

【讨论】:

    【解决方案2】:

    并行性的首选 crate 是 rayon,它可以让这变得简单:

    use rayon::prelude::*;
    
    // this just takes a big zeroed buffer and fills it with 1s with 10 threads
    fn main() {
        let mut data = vec![0u8; 2000000]; // pretend this is 2 GiB
        data.chunks_mut(200000) // pretend this is 2 GiB / N threads
            .par_bridge()
            .for_each(|d| d.fill(1));
    }
    

    切片的chunks_mut() 函数已经可以为您提供许多可变切片来分隔原始区域。然后这只是使用par_bridge() 将其转换为并行迭代器。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-14
      • 2021-08-27
      • 1970-01-01
      相关资源
      最近更新 更多