这与我的帖子here有些相关。
我正在尝试在Rust中实现矩阵乘法,我认为为了有效地执行此操作,我需要能够从矩阵中获取列数据。这很困难,因为我以行主格式存储我的矩阵。
我正在使用展开的点积产品实现,详见上文link以及之前的question。我希望能够将此方法从一个矩阵和另一个矩阵中的列提供给该方法。
如何从矩阵中有效地选择列数据?更一般地说:我如何选择任意数据模式(如R,matlab,numpy等)?
我试过了:
答案 0 :(得分:1)
如果您使用更聪明的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&#39列,并使用缓存。首先,您将访问b[k][0]
,然后b[k][1]
,依此类推。如果元素是4
字节,则可以直接从缓存中访问下一个12
元素(因为64字节是最常见的L1缓存行大小)。传统方法没有如此有效地使用缓存。