Multithreading 将原始矩阵乘法转换为Rust中每个细胞一个线程的乘法
我正在努力编译我的多线程矩阵乘法。我想用一个线程计算结果矩阵的一个单元格的方式来传递这个朴素的算法 我的代码如下所示:Multithreading 将原始矩阵乘法转换为Rust中每个细胞一个线程的乘法,multithreading,rust,Multithreading,Rust,我正在努力编译我的多线程矩阵乘法。我想用一个线程计算结果矩阵的一个单元格的方式来传递这个朴素的算法 我的代码如下所示: pub fn multiply_fast(mat1: &Matrix, mat2: &Matrix) -> Matrix { let result_mat = Matrix::new(mat1.height, mat2.width); let mut handles = Vec::new(); // for each row o
pub fn multiply_fast(mat1: &Matrix, mat2: &Matrix) -> Matrix {
let result_mat = Matrix::new(mat1.height, mat2.width);
let mut handles = Vec::new();
// for each row of Matrix A
for i in 0..result_mat.height {
// for each col of Matrix B
for j in 0..result_mat.width {
let handle = thread::spawn(|| {
let mut c = 0_f64;
// foreach row of A / col of B
for z in 0..mat1.width {
c += mat1.data[i * mat1.width + z] * mat2.data[z * mat2.width + j]
}
result_mat.data[i * result_mat.width + j] = c;
});
handles.push(handle);
}
}
for x in handles {
x.join().unwrap();
}
result_mat
}
Rust编译器告诉我mat1和mat2应该具有静态生存期。我想,如果我只使用一个线程需要的值创建数据片,我就可以解决这个问题。然后我把它们移到封口处
我对锈病的各个方面都有很好的基本了解。但即使我尝试了很多,也无法得到这份工作。有人能给我一些代码吗?我想我知道了。我每次迭代创建两个新变量,一个表示矩阵2的列,一个表示矩阵1的行。我将所有权转移到线程。但是,即使我这样做,我也不能让整个过程都顺利进行。请随意尝试,但我的直觉告诉我,每个细胞产生一个线程将是非常低效的。另一种选择是使用有线程池的人造丝,但我甚至不确定它是否会更有效。我想我已经做到了。我每次迭代创建两个新变量,一个表示矩阵2的列,一个表示矩阵1的行。我将所有权转移到线程。但是,即使我这样做,我也不能让整个过程都顺利进行。请随意尝试,但我的直觉告诉我,每个细胞产生一个线程将是非常低效的。另一种选择是使用有线程池的人造丝,但我甚至不确定它是否会更高效。