深度学习中GEMM的前世今生

BLAS简介

BLAS全称是Basic Linear Algebra Subprograms是规定了一套低级的执行常见线性代数操作的规范。其实现经常针对特殊的机器进行优化,比较著名的·BLAS库有ACML, ATLAS, MKL, OpenBLAS。许多常见的数值软件均采用兼容BLAS规范的实现库来进行线性代数计算,比如Matlab, Numpy, Mathematica`。

其中,Level 1 BLAS主要提供向量操作


Level 2 BLAS提供 矩阵向量操作(gemv)
gemv

Level 3 BLAS则提供 广义矩阵乘积操作(gemm)
gemm

GEMM在深度学习中是十分重要的,全连接层以及卷积层基本上都是通过 GEMM来实现的,而网络中大约90%的运算都是在这两层中。而一个良好的 GEMM的实现可以充分利用 系统的多级存储结构程序执行的局部性来充分加速运算。

gemm接口解析

gemm的函数接口如下图所示,darknet中也采用了类似的接口设计。

深度学习中GEMM的前世今生_第1张图片
sgemm

其中, A,B,C分别是 MxK, KxN, MxN的矩阵, TRANSA, TRANSB, TRANSC表示是否使用对应矩阵的转置, ALPHA, BETA为对应的系数。而 LDA, LDB, LDC表示对应矩阵的 leading dimension,即第一维度的大小。根据我的理解(结合 darknet的源码),是因为在内存中是连续存放的,而这个 leading dimension的量是用来定义元素的位置的,即 add(A[i, j])=A+i*lda+j。其中 sgemm中的 s表示是单精度的运算,类似的,还有 dgemm

BLAS sgemm()的实现

*           Form  C := alpha*A**T*B**T + beta*C
*
              DO 200 J = 1,N
                  DO 190 I = 1,M
                      TEMP = ZERO
                      DO 180 L = 1,K
                          TEMP = TEMP + A(L,I)*B(J,L)
  180                 CONTINUE
                      IF (BETA.EQ.ZERO) THEN
                          C(I,J) = ALPHA*TEMP
                      ELSE
                          C(I,J) = ALPHA*TEMP + BETA*C(I,J)
                      END IF
  190             CONTINUE
  200         CONTINUE

上述代码是Fortran语言,三篇有关于BLAS的论文也都是用的Fortran语言写的,在官网上也提供C的接口,但是是直接调用的Fortran编写的程序。

参考文献

  1. Basic Linear Algebra Subprograms-WikiPeia
  2. Dongarra J J, Croz J D, Hammarling S, et al. A set of level 3 basic linear algebra subprograms[J]. Acm Transactions on Mathematical Software, 1990, 16(1):1-17.
  3. Why gemm is at the heart of deep learning
  4. sgemm 官方文档

你可能感兴趣的:(深度学习中GEMM的前世今生)