有效地从向量中拉出任意切片

时间:2015-12-05 21:40:56

标签: matrix rust

这与我的帖子here有些相关。

我正在尝试在Rust中实现矩阵乘法,我认为为了有效地执行此操作,我需要能够从矩阵中获取列数据。这很困难,因为我以行主格式存储我的矩阵。

我正在使用展开的点积产品实现,详见上文link以及之前的question。我希望能够将此方法从一个矩阵和另一个矩阵中的列提供给该方法。

如何从矩阵中有效地选择列数据?更一般地说:我如何选择任意数据模式(如R,matlab,numpy等)?

我试过了:

  1. 使用跨步视图并收集迭代器 - 这似乎太慢了。
  2. 使用标准进行循环迭代,但这似乎不是由Rust编译器进行矢量化的。

1 个答案:

答案 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缓存行大小)。传统方法没有如此有效地使用缓存。