前所未有的详细总结 BLAS(一):GEMM Routine(零)

高性能计算例程:GEMM (零)

一、背景:

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

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

1.功能:

计算 α ∗ A ′ ∗ B ′ + β ∗ C \alpha*A'*B'+\beta*C αAB+βC的值,然后将结果存入C中,

即:
C ⟵ α ∗ A ′ ∗ B ′ + β ∗ C C\longleftarrow \alpha*A'*B'+\beta*C CαAB+βC
其中:

(1) α 和 β 为标量常数 \alpha \text{和} \beta \text{为标量常数} αβ为标量常数
(2) A ′ = o p ( A ) = { A , op is no transpose A T , op is transpose A'=op(A)=\left\{ \begin{aligned} &A & , & \text{op is no transpose} \\ &A^T& , & \text{op is transpose} \\ \end{aligned} \right. A=op(A)={AAT,,op is no transposeop is transpose
(3) B ′ = o p ( B ) = { B , op is no transpose B T , op is transpose B'=op(B)=\left\{ \begin{aligned} &B & , & \text{op is no transpose} \\ &B^T& , & \text{op is transpose} \\ \end{aligned} \right. B=op(B)={BBT,,op is no transposeop is transpose
(4) A ′  is  k  by  m  :  ( A ′ ) m × k A' \text{ is }k\text{ by } m \text{ : }\qquad (A')_{m \times k} A is k by m : (A)m×k
(5) B ′  is  n  by  k  :  ( B ′ ) k × n B' \text{ is }n\text{ by } k \text{ : }\qquad (B')_{k \times n} B is n by k : (B)k×n
(6) C  is  n  by  m  :  ( C ) m × n C \text{ is }n\text{ by } m \text{ : }\qquad (C)_{m \times n} C is n by m : (C)m×n
即:
C = α ∗ o p ( A ) ∗ o p ( B ) + β ∗ C C =\alpha*op(A)*op(B)+\beta*C C=αop(A)op(B)+βC

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 CBLAS_INT m:
    m 表示实际运算时 A A A 矩阵的行维度(行数),也就是 op ( A ) (A) (A) 的行维度;
    当然也是结果矩阵 C C C 的行维度(行数)。

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

  • (6) const CBLAS_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 CBLAS_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 CBLAS_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 CBLAS_INT ldc:
    Leading Dimension of C:表示 C C C 矩阵数据在内存中存储时的步长。
    注意:这里 ldc 是指的 C 的 leading dimension 而不是 op ( C ) (C) (C)的 leading dimension。

3.Leading dimension详细解释

(1)leading dimension 是什么?
leading dimension 是二维逻辑矩阵映射到一维内存空间时的映射方程的系数。
(2)为什么要使用leading dimension?leading dimension和m,n,k有什么区别?
当A矩阵就是一整个矩阵时,leading dimension确实为A矩阵的行数或者列数,但是若A矩阵仅仅只是一个更大的矩阵中的一部分时,那么leading dimension 必定不等于A的行数或列数了。如下图所示:

lda图例1

lda图例2

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Linux创始人LinusTorvalds有一句名言:Talk is cheap, Show me the code.(冗谈不够,放码过来!)。 代码阅读是从入门到提高的必由之路。尤其对深度学习,许多框架隐藏了神经网络底层的实现,只能在上层调包使用,对其内部原理很难认识清晰,不利于进一步优化和创新。  YOLOv3是一种基于深度学习的端到端实时目标检测方法,以速度快见长。YOLOv3的实现Darknet是使用C语言开发的轻型开源深度学习框架,依赖少,可移植性好,可以作为很好的代码阅读案例,让我们深入探究其实现原理。  本课程将解析YOLOv3的实现原理和源码,具体内容包括: YOLO目标检测原理  神经网络及Darknet的C语言实现,尤其是反向传播的梯度求解和误差计算 代码阅读工具及方法 深度学习计算的利器:BLASGEMM GPU的CUDA编程方法及在Darknet的应用 YOLOv3的程序流程及各层的源码解析本课程将提供注释后的Darknet的源码程序文件。  除本课程《YOLOv3目标检测:原理与源码解析》外,本人推出了有关YOLOv3目标检测的系列课程,包括:   《YOLOv3目标检测实战:训练自己的数据集》  《YOLOv3目标检测实战:交通标志识别》  《YOLOv3目标检测:原理与源码解析》  《YOLOv3目标检测:网络模型改进方法》 建议先学习课程《YOLOv3目标检测实战:训练自己的数据集》或课程《YOLOv3目标检测实战:交通标志识别》,对YOLOv3的使用方法了解以后再学习本课程。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值