1、Fortran语言
Fortran语言是为了满足数值计算的需求而发展出来的一种编程语言。
Fortran语言的最大特性是接近数学公式的自然描述,在计算机里具有很高的执行效率。它可以直接对矩阵和复数进行运算,自诞生以来广泛地应用于数值计算领域,积累了大量高效而可靠的源程序。许多科学计算库的底层实现都是采用的Fortran语言,下面介绍的BLAS和LAPACK也不例外。
2、BLAS和LAPACK
BLAS的全称是Basic Linear Algebra Subprograms,中文可以叫做基础线性代数子程序。它定义了一组应用程序接口(API)标准,是一系列初级操作的规范,如向量之间的乘法、矩阵之间的乘法等。许多数值计算软件库都实现了这一核心。
BLAS是一组向量和矩阵运行的接口规范,也可以称为API规范。Netlib用fortran实现了BLAS的这些API接口,得到的库也叫做BLAS。Netlib只是一般性地实现了基本功能,并没有对运算做过多的优化。
LAPACK (linear algebra package),是著名的线性代数库,也是Netlib用fortran语言编写的。其底层是BLAS,在此基础上定义了很多矩阵和向量高级运算的函数,如矩阵分解、求逆和求奇异值等。该库的运行效率比BLAS库高。
从某个角度讲,LAPACK也可以称作是一组科学计算(矩阵运算)的接口规范。Netlib实现了这一组规范的功能,得到的这个库叫做LAPACK库。
前面BLAS和LAPACK的实现均是用的Fortran语言。为了方便c程序的调用,Netlib开发了CBLAS和CLAPACK。其本质是在BLAS和LAPACK的基础上,增加了c的调用方式。
3、第三方实现
上面提高,可以将BLAS和LAPACK看做是接口规范,那么其他的组织、个人和公司,就可以根据此规范,实现自己的科学计算库。开源社区实现的科学计算(矩阵计算)库中,比较著名的两个就是atlas和openblas。它们都实现了BLAS的全部功能,以及LAPACK的部分功能,并且他们都对计算过程进行了优化。
Atlas (Automatically Tuned Linear Algebra Software)能根据硬件,在运行时,自动调整运行参数。Openblas在编译时根据目标硬件进行优化,生成运行效率很高的程序或者库。Openblas的优化是在编译时进行的,所以其运行效率一般比atlas要高。但这也决定了openblas对硬件依赖性高,换了机器,可能就要重新编译了。(例如A和B两台机器cpu架构、指令集不一样,操作系统一样,在A下编译的openblas库,在B下无法运行,会出现“非法指令”这样的错误)
商业公司对BLAS和LAPACK的实现,有Intel的MKL和AMD的ACML。他们对自己的cpu架构,进行了相关计算过程的优化,实现算法效率也很高。
NVIDIA针对其GPU,也推出了cuBLAS,用以在GPU上做矩阵运行。
一些BLAS、LAPACK相关关系参考链接:
https://*.com/questions/17858104/what-is-the-relation-between-blas-lapack-and-atlas
https://en.wikipedia.org/wiki/Basic_Linear_Algebra_Subprograms
https://li7hui.wordpress.com/2012/02/19/blas-lapack-and-other-numerical-computation-libs/
CBLAS的安装与使用
http://blog.csdn.net/cleverysm/article/details/1925549
kaldi中对所支持矩阵库的说明
http://kaldi-asr.org/doc/matrixwrap.html