BLAS dgemm中LDA参数的目的?

时间:2011-11-21 02:12:08

标签: 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.

然而,鉴于m和k不应该能够导出LDA? LDA何时允许大于n(或k)?

3 个答案:

答案 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。