高性能计算例程:GEMM

高性能计算例程:GEMM

一、背景:

  1. GEMM(General Matrix Multiplication)全称为“通用矩阵乘法”;
  2. GEMM是BLAS(Basic Linear Algebra Subprograms)中Level 3的例程,也是整个BLAS最重要的例程之一;

二、例程(以double类型为例):

1.功能:

计算 α ∗ \alpha* α∗op ( A ) ∗ (A)* (A)∗op ( B ) + β ∗ C (B)+\beta*C (B)+β∗C的值,然后将结果存入C中。
即:
C = α ∗ C =\alpha* C=α∗op ( A ) ∗ (A)* (A)∗op ( B ) + β ∗ C (B)+\beta*C (B)+β∗C
其中:
(1) α \alpha α 和 β \beta β 为标量常数
(2)op ( A ) (A) (A) 表示对矩阵 A A A 做一个操作,这个操作只有两个选项:什么多不做 或者 对 A A A进行转置。
(3)op ( B ) (B) (B)同上

2.例程:

void cblas_dgemm 
(
	const CBLAS_LAYOUT Layout, 
	const CBLAS_TRANSPOSE transa,
	const CBLAS_TRANSPOSE transb, 
	const CBLAS_INT m, 
	const CBLAS_INT n, 
	const CBLAS_INT k, 
	const double alpha,
	const double *a, 
	const CBLAS_INT lda, 
	const double *b, 
	const CBLAS_INT ldb, 
	const double beta, 
	double *c, 
	const CBLAS_INT ldc
);

参数说明:

  • (1) const CBLAS_LAYOUT Layout:
    矩阵的存储方式:列优先或者行优先。
    列优先:Column-Major
    行优先:Row-Major
    作者(我 E2MCC)补充:
    其实矩阵的有多种存储方式,如块行优先存储,块列优先存储,对于稀疏矩阵而言还有 COO(Triplet) CSC CSR ELL DIA 等存储方式。这里的 ColMaj 和RowMaj 是最常见的稠密矩阵的基本存储方式。

  • (2) const CBLAS_TRANSPOSE transa:
    对 A A A 进行转置操作:转置或不转置(Transpose A A A or not)

  • (3) const CBLAS_TRANSPOSE transb:
    对 B B B 进行转置操作:转置或不转置(Transpose B B B or not)

  • (4) const int m:
    m 表示实际运算时 A A A 矩阵的行维度(行数),也就是 op ( A ) (A) (A) 的行维度;
    当然也是结果矩阵 C C C 的行维度(行数)。

  • (5) const int k:
    k 表示实际运算时 A A A 矩阵的列维度(列数),也就是 op ( A ) (A) (A) 的列维度;
    同时也是实际运算时 B B B 矩阵的行维度(行数),也就是 op ( B ) (B) (B) 的行维度。

  • (6) const int n:
    n 表示实际运算时 B B B 矩阵的列维度(列数),也就是 op ( B ) (B) (B) 的列维度;

  • (7) const double alpha:
    常数项 α \alpha α。

  • (8) const double * a :
    a 为一个指针,指向 A A A 矩阵数据在内存中的位置。

  • (9) const int lda:
    Leading Dimension of A:表示 A A A 矩阵数据在内存中存储时的步长。
    注意:这里 lda 是指的 A 的 leading dimension 而不是 op ( A ) (A) (A)的 leading dimension。

  • (10) const double * b:
    b为一个指针,指向 B B B 矩阵数据在内存中的位置。

  • (11) const int ldb:
    Leading Dimension of B:表示 B B B 矩阵数据在内存中存储时的步长。
    注意:这里 ldb 是指的 B 的 leading dimension 而不是 op ( B ) (B) (B)的 leading dimension。

  • (12) const double beta:
    常数项 β \beta β。

  • (13) double * c:
    c 为一个指针,指向 C C C 矩阵数据在内存中的位置。

  • (14)const int ldc:
    Leading Dimension of C:表示 C C C 矩阵数据在内存中存储时的步长。
    注意:这里 ldc 是指的 C 的 leading dimension 而不是 op ( C ) (C) (C)的 leading dimension。

3.重点内容解释

上一篇:OneFlow: 从 Job 到 Plan


下一篇:弹幕效果