4

在对密集矩阵计算进行编程时,是否有任何理由选择行优先布局而不是列优先布局?

我知道,根据所选矩阵的布局,我们需要编写适当的代码来有效地使用高速缓存来提高速度。

以行为主的布局似乎更自然、更简单(至少对我而言)。但是像 LAPACK 这样用 Fortran 编写的主要库使用列主布局,所以做出这个选择肯定是有原因的。

4

2 回答 2

16

FORTRAN 旨在解决科学和工程问题。从科学的角度来看,以列为主的存储更为自然,因为一般的线性代数约定使用列向量并且通常将矩阵视为列向量的串联。在矩阵向量乘法中,列向量位于右侧(乘法后),连续矩阵进一步添加在左侧,例如B*(A*x). 诸如 COBOL、PL/1 和 C 之类的语言将矩阵视为行记录的集合,因此对它们而言,行优先顺序更为自然。

在线性代数中,向量由其坐标表示:x = x[1]*e1 + x[2]*e2 + ... + x[n]*en其中x[i]是向量坐标,ei是第i- 个基向量。在矩阵表示中,基向量是列向量。然后,一个线性算子A,作用于x,给出:

y = A*x = A*{x[1]*e1 + x[2]*e2 + ... x[n]*en}
        = x[1]*(A*e1) + x[2]*(A*e2) + ... x[n]*(A*en)

在矩阵表示中,线性算子An列组成,其中列iA作用于i第 - 个基向量的结果,A*x然后是 的列A与来自 的坐标的系数的线性组合x。在 FORTRAN 中,这将是:

! Zero out the result vector
DO k = 1,n
  y(k) = 0.0
END DO

! Iterate over the columns of A
DO i = 1,n
  ! Add the i-th column to the linear combination with a weight of x(i)
  w = x(i)
  DO k = 1,n
    y(k) = y(k) + w*A(k,i)
  END DO
END DO

这会自动优先于A. 这可能看起来很尴尬,但早在 50 年代,当 FORTRAN 诞生时,FMAC 硬件和寄存器优化并没有像现在这样流行。

于 2012-12-02T00:23:38.847 回答
0

我没有看到任何区别。两者都是将多维矩阵转换为线性内存顺序的好方法。转换方程非常相似。

还有 / 和 \ 。以及大端和小端。有人做出了选择,后来有人做出了另一个选择。

于 2012-12-01T23:20:37.680 回答