在编写密集矩阵计算时,是否有任何理由选择列主要布局的行主要布局? 我知道根据所选矩阵的布局,我们需要编写适当的代码以有效地使用缓存存储器以达到速度目的. 行主要布局看起
我知道根据所选矩阵的布局,我们需要编写适当的代码以有效地使用缓存存储器以达到速度目的.
行主要布局看起来更自然,更简单(至少对我而言).但是用Fortran编写的像LAPACK这样的主要库使用列主要布局,所以必须有一些理由做出这个选择.
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硬件和寄存器优化并不像现在这样流行.