BLAS简介
类似于Anaconda里面的numpy,C++里面也有类似的矩阵运算库,称之为BLAS(Basic Linear Algebra Subprograms):基础线性代数子程序库。
支持的数据类型有:
- 单精度浮点数(float)
- 双精度浮点数(double)
- 单精度复数
- 双精度复数
在机器学习里面一般我们只用float类型,很少使用double,考虑到性能,我们认为float的精度已经够了,而且速度快。
还有一个更高级的叫LAPACK,现在我们常用的BLAS其实就是LAPACK里面的一部分。
BLAS支持对子程序的封装,其实就是子函数了,它的子程序分类:
- Level1: 标量操作、向量操作、向量-向量操作
- Level2:矩阵-向量操作
- Level3: 矩阵-矩阵操作
BLAS的实现
BLAS:标准实现(Fortran)
CBLAS:C的BLAS标准实现
Atlas:一种优化实现
GotoBLAS:多线程性能良好的优化实现(已停止更新)
OpenBLAS:目前性能最好的开源实现,基于GotoBLAS
MKL:Intel实现,在Intel处理器上性能最佳
各种BLAS实现的优劣对比
市面上的BLAS实现非常多,最早是用Fortran。
CBLAS是C的BLAS标准实现,但是这种实现有个缺点,速度非常慢。
Atlas:比C要好,但不够好。比如腾讯QQ空间有一个功能,就是标脸框那个程序,怎么做呢,你每上传一张图片之后都会进行图片处理,处理完之后进行人脸检测,识别出来再把结果返回到你的业务服务器上去。那这就有个问题了,我怎么能非常快的处理这些图片。对于流量很大的网站来说,它的数据量是非常大的,我怎么能够高实时性的处理这些东西呢。这就对我们计算产生非常高的要求,要求我们计算非常快,而且是多线程的计算,所以,后来外国友人就推出了GotoBLAS,特点是在多线程的情况下性能是比较良好的。不过这个程序在2010已结不更新了,不去用它了。
目前性能最好的开源实现OpenBLAS。OpenBLAS的整体性能不够稳定,但是平均性能是所有库里面最好的。它的开发者是中国人,中科院研究所的张先义,GitHub仓库叫xianyi。它是由中国人维护的目前最好的开源实现,Caffe里面用的BLAS库就是OpenBLAS。
比如我们使用的numpy,上面使用的是Python接口,底下也用了BLAS库,比如anaconda的numpy就使用了OpenBLAS。
非开源库,MKL:Math Kernel Library。Intel推出的和Intel C++ 编译器绑定的一个库,这是目前在Intel处理器上性能最好的BLAS库,而且比OpenBLAS要稳定。但是有两个问题,1.它是和Intel C+