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的行/列数(?)