这在某种程度上与我的here帖子有关。

我正在尝试在Rust中实现矩阵乘法,并且我想为了有效地做到这一点,我需要能够从矩阵中获取列数据。这很困难,因为我将矩阵存储在行优先格式中。

我使用的是展开的点产品实现,上面的link和我以前的question中都有详细介绍。我希望能够将此方法提供给一个矩阵中的行,而将其提供给另一矩阵中的列。

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

我试过了:

  • 使用跨 View 并收集迭代器-这似乎太慢了。
  • 使用标准进行循环迭代,但是Rust编译器似乎没有对此进行向量化。
  • 最佳答案

    如果您对循环使用更巧妙的方法,则可以得到问题的答案。我的意思是,如果您为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/

    10-09 04:38