加速Rust中的矩阵乘法

qni6mghb  于 2023-06-23  发布在  其他
关注(0)|答案(1)|浏览(166)

我最近一直在努力加快下面这段源代码

let mut j_offset: usize = 0;
                for j in 0..self.object_count {
                    let mut tmp_sum: f32 = self.storage.get_unchecked(some_offset + j).sub_object;
                    for i in 0..self.some_counter {
                        tmp_sum += input_obj.get_unchecked(i)
                            * self.storage.get_unchecked(i + j_offset as usize).sub_object;
                    }
                    j_offset += self.some_counter;
                    *output_obj.get_unchecked_mut(j) = tmp_sum;
                }

感觉这个乘法可以做得更快(在原生/夜间Rust中),但是我缺少一些关于这里主要瓶颈的直觉。有什么想法吗?谢谢!

xxhby3vn

xxhby3vn1#

不久前我也在做类似的事情,几件显而易见的事情:
1.确保您已将优化级别/模式设置为release
1.用不同数量级的乘法编写一个好的基准测试。比如10 x10、100 x100等。根据算法,这将极大地改变性能。一个算法在大矩阵上可能比另一个更好。同时提供一个最低限度的基准作为问题的一部分将是伟大的。
1.查看斯特拉森算法。尽管到2022年底应该会有新的算法出现。参见https://www.nature.com/articles/s41586-022-05172-4
1.查看现有的Rust crate,我个人使用过RustNDArrayOpenBLAS。从我所观察到的性能增益是无与伦比的。如果你对使用感兴趣,看看我的repo:https://github.com/MPopovych/Neurotick/blob/main/neurotick/src/matrix/nmatrix.rs

相关问题