提问人:blomp 提问时间:7/18/2023 最后编辑:tadmanblomp 更新时间:7/19/2023 访问量:44
Rust 并行获取对 ndarray 的每个元素的可变引用
Rust get mutable reference to each element of an ndarray in parallel
问:
我正在 Rust 中处理并行矩阵乘法代码,我想在其中并行计算乘积的每个元素。我使用 s 来存储我的数据。因此,我的代码将单独是行ndarray
fn mul(lhs: &Array2<f32>, rhs: &Array2<f32>) -> Array2<f32> {
let N = lhs.raw_size()[0];
let M = rhs.raw_size()[1];
let mut result = Array2::zeros((N,M));
range_2d(0..N,0..M).par_iter().map(|(i, j)| {
// load the result for the (i,j) element into 'result'
}).count();
result
}
有什么办法可以做到这一点吗?
答:
0赞
Chayim Friedman
7/18/2023
#1
您可以通过以下方式创建并行迭代器:
use rayon::prelude::*;
pub fn mul(lhs: &Array2<f32>, rhs: &Array2<f32>) -> Array2<f32> {
let n = lhs.raw_dim()[0];
let m = rhs.raw_dim()[1];
let mut result = Array2::zeros((n, m));
result
.axis_iter_mut(Axis(0))
.into_par_iter()
.enumerate()
.flat_map(|(n, axis)| {
axis.into_slice()
.unwrap()
.par_iter_mut()
.enumerate()
.map(move |(m, item)| (n, m, item))
})
.for_each(|(n, m, item)| {
// Do the multiplication.
*item = n as f32 * m as f32;
});
result
}
评论
0赞
blomp
7/19/2023
据我所知par_bridge效率真的很低。从本质上讲,我认为瓶颈是 Array2,因为将其切成可变块是可能的,但只是一种痛苦。在提出这个问题时,我虽然可能有一种方法可以生成指向每个项目的原始指针,就像split_at_mut如何做到这一点一样,但似乎并非如此。
0赞
Chayim Friedman
7/19/2023
@stomfaig 经过进一步的思考,我得出了没有 .编辑了上面的答案。par_bridge()
评论
ndarray
确实支持,但我没有看到对提取索引的支持。rayon