2011-11-21 148 views
31

的Fortran语言参考实现文档状态:BLAS dgemm中LDA参数的用途?

* 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)?

回答

19

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

32

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

4

另一种看待它的方式是LDA是y-stride,意思是在行 - 主布局中,元素A [y,x]的地址计算为x + LDA * y。对于x-data LDA = xSize的相邻行之间没有间隙的“压缩”存储器布局。