Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ “sgemm”的维度参数是如何工作的?_C++_Matrix Multiplication_Lapack - Fatal编程技术网

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。