Matrix 有效地从向量中提取任意切片

Matrix 有效地从向量中提取任意切片,matrix,rust,Matrix,Rust,这与我的帖子有些关系 我正在尝试在Rust中实现矩阵乘法,我认为为了有效地实现这一点,我需要能够从矩阵中获取列数据。这是很困难的,因为我正在以行主格式存储矩阵 我正在使用一个展开的点产品实现,这在上面和我之前的文章中都有详细介绍。我希望能够将一个矩阵中的行和另一个矩阵中的列提供给这个方法 如何有效地从矩阵中选择列数据?更一般地说:如何选择任意数据模式(如R、matlab、numpy等) 我试过: 使用快速视图并收集迭代器-这似乎太慢了 使用标准for循环迭代,但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不一定会自动矢量化跨步循环,即使它能识别跨步循环,请参阅