multithreading - Rust 中大内存块的并行初始化
问题描述
做这个的最好方式是什么:
我有一个需要用一些数据初始化的 2GiB 内存块。数据都是独立的,因此我可以轻松地生成 n 个线程来并行初始化数据,每个线程在单独的内存位置上工作。
我怎样才能“告诉”这个 Rust。它不允许我在线程之间共享内存(有充分的理由和正当的)。我知道不会有竞争条件,因为每个线程都在完全独立的内存位置上工作。
一种想法是使用(横梁)通道。每个线程将计算发送给一个将内存放入正确位置的写入器。唉,这感觉过于复杂且不够高效。是否有某种方法可以为线程划分内存以使其安全地使用不同的线程?
解决方案
并行性的首选板条箱是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));
}
slice的chunks_mut()
功能已经可以为您提供许多可变切片来分隔原始区域。然后这只是用于par_bridge()
将其转换为并行迭代器。
推荐阅读
- batch-file - 文件不断被删除
- python - 将数据框列从文本更改为熊猫数据框中的数字
- javascript - (Js) 循环中未定义的标签元素创建
- php - php表单提交并感谢您带有他们名字的消息
- flutter - 是否可以为 3 种架构构建一个 apk?
- python - Tkinter 入口小部件验证 - 让我的代码更性感
- sql-server - 如何在 mulesoft 应用程序中启用 SQL Server 数据库的身份插入?
- python - 使用 pandas 将三个单独的 CSV 文件中的特定元素连接到一个 CSV 文件中
- c# - 如何使用实例化在玩家位置旁边生成对象
- amazon-web-services - 我是否总是必须明确承担角色才能访问 S3?