LAPACK
如果矩阵的规模较小,直接按照公式展开计算倒是看不出性能上有什么大问题,比如两个二维方阵相乘,计算公式如下
c
[
i
]
[
j
]
=
∑
k
=
1
n
a
[
i
]
[
k
]
∗
b
[
k
]
[
j
]
,
1
⩽
i
⩽
n
,
1
⩽
j
⩽
n
c[i][j]=\sum^n_{k=1}a[i][k]*b[k][j],\quad 1\leqslant i\leqslant n,1\leqslant j\leqslant n
c[i][j]=k=1∑na[i][k]∗b[k][j],1⩽i⩽n,1⩽j⩽n
但是,随着矩阵规模的增大,这种计算方式的性能瓶颈就比较突出了,根本无法满足正常的业务需要。
下面介绍基于 BLAS (Basic Linear Algebra Subprograms) 算法库的线性代数库 LAPACK (Linear Algebra PACKage),该库是用 Fortran 编写的算法库,是为了解决通用的线性代数问题的。不少计算机厂商都提供了针对不同处理器进行了优化的 BLAS/LAPACK 算法包,例如 Intel 的 MKL (Math Kernel Library,商业版),AMD 的 ACML 等。在 Matlab 的 bin 目录里可以发现 MKL、blas、lapack 的踪影,所以由此推断,Matlab 底层应该也是使用了 BLAS/LAPACK 库的。
CLAPACK
CLAPACK 是使用 f2c 工具将 LAPACK 的 Fortran 代码转换成 C 语言代码的 C 语法算法包,其主页是 http://www.netlib.org/clapack,下面介绍如何在 windows 系统中编译生成 CLAPACK 库。
环境准备
- Windows 10
- Visual Studio 2019(受支持的其它版本亦可)
- 下载 cmake,并安装到系统上
- 在 CLAPACK 的主页 http://www.netlib.org/clapack 下载源码包
clapack-3.2.1-CMAKE.tgz
,并解压
编译 CLAPACK 源码
首先,打开 CMake(cmake-gui)应用程序,如下图所示
第一步,输入 clapack 源码目录;第二步,指定一个新目录,用于存放要生成的解决方案 (CLAPACK.sln);第三步,设置要生成的解决方案的参数,如下图所示
选择使用 Visual Studio 16 2019
生成工程,并指定 x64
平台(后面可以按照同样的步骤生成 win32
或其它平台下的工程),点击 Finish 按钮,就会开始生成解决方案了。如果生成后有红色的错误提示信息,如下图所示,点击按钮 Generate 重新生成即可,可能需要执行两次,错误提示信息才会消失。
之后就可以到生成的解决方案目录下,打开解决方案 CLAPACK.sln
,并分别编译 Debug 和 Release 版本。然后,就可以分别到对应的工程目录下找到编译好的库文件,有以下三个:
blas.lib
libf2c.lib
lapack.lib
而引用上述静态库所需要包含的头文件,则可以在 CLAPACK 源码目录下的 INCLUDE 目录下找到,有以下三个文件:
blaswrap.h
clapack.h
f2c.h
将编译好的静态库文件和需引用的头文件收集到一起,就可以提供给其它动态库或应用程序引用。