我最近一直在努力加快下面这段源代码
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中),但是我缺少一些关于这里主要瓶颈的直觉。有什么想法吗?谢谢!
1条答案
按热度按时间xxhby3vn1#
不久前我也在做类似的事情,几件显而易见的事情:
1.确保您已将优化级别/模式设置为release
1.用不同数量级的乘法编写一个好的基准测试。比如10 x10、100 x100等。根据算法,这将极大地改变性能。一个算法在大矩阵上可能比另一个更好。同时提供一个最低限度的基准作为问题的一部分将是伟大的。
1.查看斯特拉森算法。尽管到2022年底应该会有新的算法出现。参见https://www.nature.com/articles/s41586-022-05172-4
1.查看现有的Rust crate,我个人使用过RustNDArray和OpenBLAS。从我所观察到的性能增益是无与伦比的。如果你对使用感兴趣,看看我的repo:https://github.com/MPopovych/Neurotick/blob/main/neurotick/src/matrix/nmatrix.rs