multithreading - 我想制作 rust 的 for 语句多线程
问题描述
我想将以下功能更改为并行处理。
fn cal_v(c: &Array3<f32>, dt: f32) -> Array3<f32> {
let mut v: Array3<f32> = Array::zeros(c.raw_dim());
for time in 1..c.shape()[0] {
let before = c.slice(s![time-1, .., ..]).to_owned();
let now = c.slice(s![time, .., ..]).to_owned();
let now_v = (before - now) / dt;
v.slice_mut(s![time, .., ..]).assign(&now_v);
}
v
}
函数 c 是一个 3 维数组,其中第一维是时间索引,第二维是粒子数索引,第三维是 x,y,z。就个人而言,我想学习如何编写多线程代码,我想学习如何使其成为多线程,所以我想做for time in 1..c.shape()[0]
多线程的部分。我相信这个过程可以并行化或异步化,因为在任何索引的过程中都没有依赖关系for
。写这个的最好方法是什么?
我使用的编译器版本是1.51.0
. 我正在使用的库版本是ndarray(0.14.0)
.
解决方案
并行化迭代的最简单方法是只使用rayon,这基本上是它的生计。您必须将循环转换为更实用的样式(for_each
用于最终循环体),但完成par_iter()
后将“神奇地”将工作分配到其线程池中。
有一个问题我不太清楚,因为您没有提供任何代码:
v.slice_mut(s![time, .., ..]).assign(&now_v);
是所有项目之间的硬顺序依赖关系,我不知道s
宏的作用,所以它可能可行,也可能不可行。如果每个从(或至少不重叠的插槽)time
产生一个插槽,您将能够将迭代器放在一起,以便每个迭代都有一个独立于所有其他迭代的“源”和一个“目标”,否则你会有一个输出中的顺序阻塞点,这不是人造丝很好地支持的。v
zip
推荐阅读
- django - User.is_authonticated 在登录页面异常返回 false django
- reactjs - 如何将来自状态的参数添加到redux中的异步操作?
- php - PHP 7.x 数组处理/扩展
- actions-on-google - iOS 设备上的操作链接未重定向到正确的操作
- javascript - 如何在 Bootstrap 4 上向 Lightbox 添加关闭按钮
- xslt - XSLT 转换将子 xlmns 传输到父
- android - 在 Android 中使用有限制的 Google API Key
- velocity - 将前导零添加到速度最多 11 个字符的数字
- python - 在 Python multiprocessing.Pool 中共享可变全局变量
- expo - 如何使用 Expo web (React Native Web) 进行代码拆分?