Matrix 有效地从向量中提取任意切片
这与我的帖子有些关系 我正在尝试在Rust中实现矩阵乘法,我认为为了有效地实现这一点,我需要能够从矩阵中获取列数据。这是很困难的,因为我正在以行主格式存储矩阵 我正在使用一个展开的点产品实现,这在上面和我之前的文章中都有详细介绍。我希望能够将一个矩阵中的行和另一个矩阵中的列提供给这个方法 如何有效地从矩阵中选择列数据?更一般地说:如何选择任意数据模式(如R、matlab、numpy等) 我试过:Matrix 有效地从向量中提取任意切片,matrix,rust,Matrix,Rust,这与我的帖子有些关系 我正在尝试在Rust中实现矩阵乘法,我认为为了有效地实现这一点,我需要能够从矩阵中获取列数据。这是很困难的,因为我正在以行主格式存储矩阵 我正在使用一个展开的点产品实现,这在上面和我之前的文章中都有详细介绍。我希望能够将一个矩阵中的行和另一个矩阵中的列提供给这个方法 如何有效地从矩阵中选择列数据?更一般地说:如何选择任意数据模式(如R、matlab、numpy等) 我试过: 使用快速视图并收集迭代器-这似乎太慢了 使用标准for循环迭代,但Rust编译器似乎没有将其矢量化
如果你使用更聪明的for循环,你就能得到问题的答案。我的意思是,如果你对for循环重新排序,你不必从矩阵中抽出一列。这样,就可以使CPU缓存保持温暖 如果当前算法如下所示:
// traditional multiplication
for i in 0..a_rows {
for j in 0..b_cols {
for k in 0..a_cols {
c[i][j] += a[i][k] * b[k][j];
}
}
}
由于b[k][j]不按顺序访问数据,因此会产生大量缓存未命中
for i in 0..a_rows {
for k in 0..a_cols {
// Note, that j iterates over a column of B
for j in 0..b_cols {
c[i][j] += a[i][k] * b[k][j];
}
}
}
如果您交换两个内部循环,您将按顺序迭代B的列并利用缓存。首先,您将访问
b[k][0]
,然后访问b[k][1]
,依此类推。如果元素为4
字节,则可以直接从缓存访问下一个12
元素(因为64字节是最常见的一级缓存线大小)。传统方法使用缓存的效率不高。我觉得您缺少上下文。例如,为什么不能直接使用跨步视图?您能否先转置整个(子?-)矩阵,并消除重复数据?什么没有被矢量化也许我们可以解决这个问题。LLVM不一定会自动矢量化跨步循环,即使它能识别跨步循环,请参阅