"sgemm"的尺寸论点是如何工作的?

How does the dimention argument of `sgemm` work?

本文关键字:quot 工作 何工作 sgemm      更新时间:2023-10-16

我正在尝试理解sgemm的文档,因为我正在将代码从使用此库过渡到其他库。

函数原型为

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 
)   

我无法理解角色或LDALDB。文件说

LDA 是整数

在输入时,LDA 指定声明的 A 的第一个维度 在调用(子(程序中。当 TRANSA = 'N' 或 'n' 时,则 LDA 必须至少为 max( 1, m (,否则 LDA 必须为 最小最大值( 1, k (。

它指定 A 的第一个维度是什么意思?这就像在行和列主要之间切换吗?还是这是切片张量?

LD 代表 前导维度。BLAS 最初是一个 Fortran 77 子例程的库,在 Fortran 矩阵中是按列存储的:A(i,j)在内存中紧跟着A(i+1,j),这与 C/C++相反,a[i][j]后跟a[i][j+1]。为了访问具有维度A(LDA,*)的矩阵的元素A(i,j)(读取为LDA行和未指定数量的列(,您需要从矩阵的开头查找(j-1)*LDA + (i-1)元素(Fortran 数组默认为 1 索引(,因此您需要知道LDA的值。您不需要知道实际的列数,因此不需要知道虚拟参数中的*

在 C/C++ 中也是如此。如果你有一个声明为a[something][LDA]的 2D 数组,那么元素a[i][j]位于数组开始后i*LDA + j位置,你只需要知道LDA-something的值不会影响a[i][j]地址的计算。

虽然GEMM在M x K矩阵A上运行,但实际数据可以嵌入到一个更大的LDA x L矩阵中,其中LDA >= ML >= K,因此LDA被明确指定。这同样适用于LDBLDC.

BLAS是多年前开发的,当时计算机编程与今天完全不同。特别是内存管理,不像现在这样灵活。分配一个大矩阵,然后使用和重用其中的一部分来存储较小的矩阵是常态。此外,GEMM 还广泛用于例如在各种子矩阵上工作的迭代算法,将数据保留在原始矩阵中并仅指定子矩阵位置和维度的速度更快,因此您需要提供这两个维度。

从Fortran 90开始,该语言具有数组切片和自动数组描述符,允许人们发现切片的维度和更大矩阵的维度,因此如果GEMM是用Fortran 90或更高版本编写的,那么它的参数就不会那么冗长。但即使是这种情况,C 也没有数组描述符,因此您仍然必须提供所有这些参数才能使 GEMM 可以从 C 调用。在C++中,可以将描述符隐藏在矩阵类中,许多数学库实际上都是这样做的(例如,Scythe(。