这在某种程度上与我的here帖子有关。
我正在尝试在Rust中实现矩阵乘法,并且我想为了有效地做到这一点,我需要能够从矩阵中获取列数据。这很困难,因为我将矩阵存储在行优先格式中。
我使用的是展开的点产品实现,上面的link和我以前的question中都有详细介绍。我希望能够将此方法提供给一个矩阵中的行,而将其提供给另一矩阵中的列。
如何有效地从矩阵中选择列数据?更笼统地说:如何选择任意数据模式(例如R,matlab,numpy等)?
我试过了:
最佳答案
如果您对循环使用更巧妙的方法,则可以得到问题的答案。我的意思是,如果您为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字节是最常见的L1缓存行大小)。传统方法不能如此高效地使用缓存。关于matrix - 有效地从向量中提取任意切片,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34111229/