Fortran参考实现文档指出:
* LDA - INTEGER.
* On entry, LDA specifies the first dimension of A as declared
* in the calling (sub) program. When TRANSA = 'N' or 'n' then
* LDA must be at least max( 1, m ), otherwise LDA must be at
* least max( 1, k ).
* Unchanged on exit.
然而,鉴于m和k不应该能够导出LDA? LDA何时允许大于n(或k)?
答案 0 :(得分:37)
BLAS中的LDA参数实际上是矩阵的步幅,因为它在线性存储器中布局。 LDA值大于正在操作的矩阵的前导尺寸是完全有效的。使用较大LDA值有用或必要的典型情况是,当您从较大的密集矩阵操作子矩阵时,以及当存储被填充到某个最佳大小的圆倍数时,硬件或算法提供性能优势(缓存行或GPU内存事务大小,或多处理器实现中的负载平衡,例如)。
答案 1 :(得分:20)
区别在于阵列A和B的第一维的逻辑大小与物理大小之间。第一个是您正在使用的数组的大小,第二个是声明中的值,或者使用的物理内存量。由于Fortran是列主要语言,因此必须知道除last之外的所有索引的声明大小,以便计算数组元素的位置。注意FORTRAN 77样式声明“A(LDA,),B(LDB,),C(LDC,*)”。声明的数组大小可能大于您使用的部分;当然它不能小。
答案 2 :(得分:6)
另一种看待它的方法是LDA是y-stride,意思是在行主要布局中,元素A [y,x]的地址计算为x + LDA * y。对于"打包"存储器布局在x数据的相邻行之间没有间隙LDA = xSize。