导师突然通知要开始关于blas的讨论班,之前甚至都没听说过blas这个词,又要开始新一波的锤炼小白之路了…
1. BLAS简介
首先BLAS的全称是 Basic Linear Algebra Subprograms,即 基础线性代数子程序库,其中包含了一系列基本的线性代数运算函数的接口,因此BLAS也会被称为 矩阵运算库 。
需要注意,BLAS是一个接口的标准而不是某种具体实现,也就是说即便不同版本的BLAS库可以实现相同的接口和功能,但每个接口内部的算法和程序是可以不同的,即具体实现不相同。目前存在几种不同的BLAS (性能对比可参考矩阵运算库之间的性能区别):
1.1 两种基本运算库
- BLAS:其官网是 Netlib,Netlib用Fortran语言实现了BLAS的这些API接口,但只是一般性地实现了基本功能,并没有对运算做过多的优化,因此这个版本的 BLAS 被称为 reference BLAS,运行速度较慢,通常被其他版本用于衡量性能。之后Netlib又产生了C 语言的版本 cBLAS,除一些接口外与BLAS之间并没有太大的区别。
- LAPACK:其官网也是 Netlib,是Netlib以BLAS为底层利用Fortran语言实现的另一矩阵运算库,该库相比于BLAS库提供了更为丰富的计算工具,其运行效率也要比BLAS库高。对应cBLAS,也产生了相应的cLAPACK。
1.2 三种高级运算库
- MKL:其官网是 MKL(Math Kernel Library),它是基于英特尔® C++和Fortran编译器构建而成,底层包含了BLAS、LAPACK、ScaLAPACK(面向集群的 LAPACK 分布式内存并行版本)、PARDISO(该并行直接稀疏矩阵解算器的三个阶段均实现了线程化)、DFTs(离散傅立叶变换)、VML(矢量数学库)、VSL(矢量统计学库),因此MKL提供的 BLAS 可以认为是当前性能最高的矩阵运算库。MKL 虽然不是一个开源软件,但目前可以免费下载使用。
- Armadillo:其官网是 C++ library for linear algebra & scientific computing,与Matlab相似,是一个易于使用的C++矩阵库。其底层包含了LAPACK、BLAS和 ATLAS(Automatically Tuned Linear Algebra Soft) 封装包,支持MKL和 OpenBLAS 等诸多高性能版本。
- Eigen:其官网是 C++ template library for linear algebra,Eigen是可以用来进行线性代数、矩阵、向量操作等运算的C++库,它采用源码的方式提供给用户使用,只需要包含Eigen的头文件即可使用。它支持以BLAS/LAPACK作为底层 (EIGEN_USE_BLAS、EIGEN_USE_LAPACKE),也支持以MKL作为底层 (EIGEN_USE_MKL_ALL),使用起来非常的方便。
1.3 对比
没有时间打字了,就直接截图过来了,上面给了参考链接,这里再放一遍 (矩阵运算库之间的性能区别)。
看到现在感觉MKL是最强的,在 BLAS简介 中看到作者说无论使用哪种软件,都推荐阅读一下 MKL中BLAS的说明文档。