Blas

 

openblas是一个矩阵乘法加速的开源库,在cpu运行环境中,对不同数据类型的矩阵乘法提供加速.

虽然在服务器领域,cuda库具有压倒性的优势,但是对于深度学习的初学者和嵌入式领域,openblas依然能发挥巨大的作用.

什么是BLAS

BLAS是Basic Linear Algebra Subprograms(基本线性代数子程序)的首字母缩写,主要用来做基础的矩阵/向量计算.它分为三级:

  • BLAS1级:用来做向量与向量间的dot(点积)或乘加运算,对应元素的计算;
  • BLAS2级:用来做矩阵和向量的乘法运算;
  • BLAS3级:用来做矩阵和矩阵的乘法运算; BLAS是一组通用接口,在现代科学计算中,绝大多数的时间都花费在BLAS操作上.BLAS的底层优化对处理器的依赖很高,根据不同的处理器有不同的优化工作.

    深度学习与BLAS

    深度学习算法在执行过程中,消耗时间最多的是卷积层和全连接层,这两层的操作都可以转换为blas操作.

在caffe中,卷积操作被拆分为了im2col和sgemm.

其中im2col的作用是把每次卷积核要乘的数据取出来,然后合并成一个大矩阵.

sgemm把im2col输出的数组和卷积核进行矩阵乘法.

OpenBLAS的float矩阵乘法函数为cblas_sgemm:

void cblas_sgemm(const enum CBLAS_ORDER Order, 
                const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_TRANSPOSE TransB, 
                const int M, const int N,const int K, 
                const float alpha, const float  *A, const int lda, 
                const float  *B, const int ldb, 
                const float beta, float  *C, const int ldc)

运算效果为:C=alpha*op(A)*op(B)+beta*C

各参数的含义如下: 参数|含义 —|— CBLAS_ORDER Order|数据的存储方式,行/列主序,行主序常用,CblasRowMajor TransA|A指针的数据存储方式,以Order为基准,是否转置 TransB|B指针的数据存储方式,以Order为基准,是否转置 M|矩阵A的行,矩阵C的行 N|矩阵B的列,矩阵C的列 K|矩阵A的列,矩阵B的行 alpha/beta|乘法参数 A/B/C|三个矩阵数据的指针 lda/ldb/ldc|ABC的行/列数(?)