2008年写的一个数值计算开源库综述,当时没有明确的用途,因此只是汇总当时网上能找到的、有些名气的开源数值计算库,简单介绍各个库,部分还给出了用例。十年过后,有些开源库已不再维护,也有新的优秀开源库冒出。目前工作已经限定在音频开发,因此利用春节放假重新收集资料,重写该综述。

不同的数值库覆盖的功能不同,涉及矩阵,特殊函数,概率统计和数值计算。下面先介绍矩阵库,然后介绍通用数值库和专用数值库。

1.1、矩阵库分BLAS和非BLAS系列。BLAS和LAPACK是接口规范,也就是业界通用的API接口标准,不同实现应该可以互相替换。BLAS Level 1/2/3规定了要实现的功能。LAPACK库设计目标是作为BLAS中Level 3函数的扩展库。

The Level 1 BLAS perform scalar, vector andvector-vector operations.

The Level 2 BLAS perform matrix-vector operations.

The Level 3 BLAS perform matrix-matrix operations.

基于BLAS规范的矩阵库有很多,既有开源软件(ATLAS、OpenBLAS等),又有商业软件(Intel的MKL、AMD的ACML、NVIDIA的cuBLAS、IBM的ESSL和TI的MathLib)。特别是Netlib用Fortran语言实现了BLAS和LAPACK规范,同时代码库的名字也叫做BLAS和LAPACK。所以BLAS和LAPACK即是API接口,又指Netlib实现版本,具体含义根据上下文来确定。总结就是BLAS/LAPACK分3种实现:netlib/商业/开源(netlib也是开源软件,但由于它是其他优化版本的参考对象,因此单独罗列。)

下图列出了各种BLAS库之间的关系图。

OpenBLAS是基于GotoBLAS做的,GoToBLAS在2010年终止开发了。OpenBLAS算是目前全球最好的开源矩阵计算库,目前OpenBLAS的进展是,支持几乎全部的主流CPU处理器,同时都能达到比较好的优化性能。从操作系统来说,基本上常见主流的OS都支持。整体上,从适配的处理器范围和支持的操作系统,在开源库中算是最广的实现。开源项目Julia语言、GNU octave等,深度学习方面有大家熟悉的mxnet、Caffe都可以选用OpenBLAS。

TI DSP提供的Mathlib包含的BLAS功能是基于blis优化而来,。

CBLAS是BLAS的C语言接口。ATLAS 是在编译过程中探测最佳配置。Armadillo封装BLAS接口以便提供类似Matlab更易使用的接口。这3个算是BLAS Wrapper。

1.2、非BLAS系列:Eigen、MTL和blitz++都是基于C++模板的线性代数开源库,不遵从BLAS接口规范。目前还没用过这3个库,将来有时间了再来测试。

Blitz++ class library: Arrayand Vector classes which rival Fortran's performance.

2、通用数值库非GNU Scientific Library (GSL)莫属。作为高层数学库一般不再实现矩阵运算,都用BLAS和LAPACK做底层,在其上面再封装一下,GSL默认使用CBLAS。另外mygsl是基于GSL V1.14的项目,致力于提升GSL库的计算效能,V1.0发布于Feb/15/2011,后续没看到新版本,因此不予考虑。

3、专用数值库主要是FFT计算和定点数学函数库。一般DSP芯片厂商会以源代码或者Lib库的形式提供优化后的FFT,有些芯片还会提供优化后的数学函数运算库。对音频开发工程师来说,前期需要一个浮点/定点FFT能在PC机上调试算法代码即可。FFTW3的优点是性能高、功能广泛,Matlab也在使用。FFTW3最大的缺点是不支持定点运算。最新的KissFFT支持浮点、16/32位定点,24位定点FFT其实可以用32位定点完成,实测测试24位定点运算的精度没问题。因此KissFFT很适合在PC上测试音频代码。如果只需要开发浮点代码,那么FFTW3就是最好的选择。如果要开发DSP定点代码,前期的PC版本开发测试就选用KissFFT。

libfixmath和libfixmatrix是一个不错的定点数学函数库,可以作为自行开发的起点。只是精度有待确认、MIPS性能有待改进。

4、数值计算库选型总结:矩阵用OpenBLAS,通用数值库用GSL,FFT库选FFTW3或KissFFT,定点数学函数库需要自己慢慢积累。下一步工作是把它们整合到一个框架里面,避免每次开发都要重新造轮子或者复制粘贴代码。

Netlib的BLAS官网:

OpenBLAS项目与矩阵乘法优化:

BLAS关系图:

线性代数库比较:

数学开源库汇总:

Intel IPP官网: