在编写密集矩阵计算时,有没有理由选择列主要布局的行主要布局?
我知道,根据所选矩阵的布局,我们需要编写适当的代码,以便有效地使用缓存内存。
行主要布局看起来更自然,更简单(至少对我而言)。但是用Fortran编写的像LAPACK这样的主要库使用列主要布局,所以必须有一些理由做出这样的选择。
答案 0 :(得分: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)
在矩阵表示中,线性运算符A
由n
列组成,列i
是A
作用于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硬件和寄存器优化并不像现在那样受欢迎。
答案 1 :(得分:0)
我没有看到任何差异。要么是将多维矩阵转换为线性记忆顺序的好方法。转换方程非常相似。
还有/和\。和大和小端。有人做出了选择,后来其他人做出了另一种选择。