BLAS dgemm中LDA参数的目的?

Set*_*jmp 40 c fortran blas

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.
Run Code Online (Sandbox Code Playgroud)

但是,给定m和k不应该能够导出LDA?LDA何时允许大于n(或k)?

tal*_*ies 38

BLAS中的LDA参数实际上是矩阵的步幅,因为它在线性存储器中布局.LDA值大于正在操作的矩阵的前导尺寸是完全有效的.使用较大LDA值有用或必要的典型情况是,当您从较大的密集矩阵操作子矩阵时,以及当存储被填充到某个最佳大小的圆倍数时,硬件或算法提供性能优势(缓存行或GPU内存事务大小,或多处理器实现中的负载平衡,例如).


M. *_* B. 20

区别在于阵列A和B的第一维的逻辑大小与物理大小之间.第一个是您正在使用的数组的大小,第二个是声明中的值,或者使用的物理内存量.由于Fortran是列主要语言,因此必须知道除last之外的所有索引的声明大小,以便计算数组元素的位置.注意FORTRAN 77样式声明"A(LDA,),B(LDB,),C(LDC,*)".声明的数组大小可能大于您使用的部分; 当然它不能小.


And*_*sky 6

另一种看待它的方法是LDA是y-stride,意思是在行主要布局中,元素A [y,x]的地址被计算为x + LDA*y.对于"打包"的存储器布局,在x-数据的相邻行之间没有间隙LDA = xSize.