C++ “sgemm”的维度参数是如何工作的?
我正在尝试理解的文档,因为我正在将代码从使用这个库转换到另一个库 功能原型是C++ “sgemm”的维度参数是如何工作的?,c++,matrix-multiplication,lapack,C++,Matrix Multiplication,Lapack,我正在尝试理解的文档,因为我正在将代码从使用这个库转换到另一个库 功能原型是 sgemm ( character TRANSA, character TRANSB, integer M, integer N, integer K, real ALPHA, real, dimension(lda,*) A, integer
sgemm ( character TRANSA,
character TRANSB,
integer M,
integer N,
integer K,
real ALPHA,
real, dimension(lda,*) A,
integer LDA,
real, dimension(ldb,*) B,
integer LDB,
real BETA,
real, dimension(ldc,*) C,
integer LDC
)
我很难理解LDA和LDB的角色。文件上说
LDA是整数
输入时,LDA指定声明的第一个维度
在调用子程序中。当TRANSA='N'或'N'时,则
LDA必须至少为最大值1,m,否则LDA必须为
最小最大值1,k
它指定的第一个维度是什么意思?这像是在行和列之间切换主键吗?或者这是切片张量 LD代表领先维度。BLAS最初是一个Fortran 77子程序库,在Fortran中,矩阵按列存储:Ai,j在内存中紧跟Ai+1,j,这与C/C++相反,其中a[i][j]后跟a[i][j+1]。为了访问维度为ALDA*的矩阵的元素Ai,j,读取为LDA行和未指定数量的列,您需要查看矩阵开头的j-1*LDA+i-1元素Fortran数组默认为1索引,因此您需要知道LDA的值。您不需要知道实际的列数,因此在伪参数中使用* 在C/C++中也是如此。如果将2D数组声明为[i][LDA],则元素a[i][j]位于数组开始后的i*LDA+j位置,您只需要知道LDA-某物的值不会影响[i][j]地址的计算 尽管GEMM在M x K矩阵A上运行,但实际数据可能嵌入到更大的矩阵中,即LDA x L,其中LDA>=M和L>=K,因此明确指定LDA。这同样适用于土地发展银行和土地发展公司 BLAS是在许多年前开发的,当时的计算机编程与今天大不相同。特别是内存管理,不如现在灵活。分配一个大矩阵,然后使用和重用其中的一部分来存储较小的矩阵是标准。此外,GEMM广泛用于各种子矩阵的迭代算法中,将数据保留在原始矩阵中更快,只需指定子矩阵的位置和维度,因此需要同时提供这两个维度 从Fortran 90开始,该语言具有数组切片和自动数组描述符,允许人们发现切片和较大矩阵的维度,因此如果GEMM是用Fortran 90或更高版本编写的,它的参数就不会那么详细。但是即使是这样,C也没有数组描述符,所以为了提供GEMM在C++中C.的调用,你仍然必须提供所有这些参数,可以将描述符隐藏在矩阵类中,许多数学库实际上这样做,例如Scythe。