我正在编写Rust中的一个并行矩阵乘法代码,我希望在其中并行计算乘积的每个元素.我用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
}

有什么办法可以做到这一点吗?

推荐答案

您可以通过以下方式创建并行迭代器:

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
}

Rust相关问答推荐

如何格式化传入Rust中mysql crate的Pool::new的字符串

在UdpSocket上使用sendto时的隐式套接字绑定

在跨平台应用程序中使用std::OS::Linux和std::OS::Windows

为什么这是&q;,而让&q;循环是无限循环?

将Vec<;U8&>转换为Vec<;{Float}&>

为什么实现特征的对象期望比具体对象有更长的生命周期?

为什么 Rust 创建的 f32 小于 f32::MIN_POSITIVE?

如何从borrow 的异步代码运行阻塞代码?

返回优化后的标题:返回异步块的闭包的类型擦除

如何为已实现其他相关 std trait 的每个类型实现一个 std Trait

如何从trait方法返回std :: iter :: Map?

max(ctz(x), ctz(y)) 有更快的算法吗?

将 `&T` 转换为新类型 `&N`

为什么可以从闭包中返回私有 struct

为什么这个值在上次使用后没有下降?

通用类型,不同于输入类型,作为函数的返回值

有没有办法使用 NASM 语法进行内联汇编?

如何将 while 循环内的用户输入添加到 Rust 中的向量?

为什么 u64::trailing_zeros() 在无分支工作时生成分支程序集?

来自外部函数的future 内部可变引用