行主要与列主要矩阵布局

smi*_*dha 4 performance fortran matrix

在编写密集矩阵计算时,是否有任何理由选择列主要布局的行主要布局?

我知道根据所选矩阵的布局,我们需要编写适当的代码以有效地使用缓存存储器以达到速度目的.

行主要布局看起来更自然,更简单(至少对我而言).但是用Fortran编写的像LAPACK这样的主要库使用列主要布局,所以必须有一些理由做出这个选择.

Hri*_*iev 16

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

在线性代数中,向量由其坐标表示:x = x[1]*e1 + x[2]*e2 + ... + x[n]*en其中x[i]是向量坐标,eii第 - 基向量.在矩阵表示中,基矢量是列矢量.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)
Run Code Online (Sandbox Code Playgroud)

在矩阵表示中,线性算子An列组成,列iA作用于第i-th基矢量的结果,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
Run Code Online (Sandbox Code Playgroud)

这会自动优先选择列主要存储空间A.它可能看起来很尴尬,但是在50年代,当FORTRAN诞生时,FMAC硬件和寄存器优化并不像现在那样受欢迎.