引言
最近在计算矩阵特征值的问题上,用到了 SLEPc(Scalable Library for Eigenvalue Problem Computations),SLEPc 可用于超大稀疏矩阵特征值的快速并行计算,也可以用于其他 SVD 分解等常用矩阵计算。SLEPc 的安装依赖于其他通用科学计算库,比如 PETSc,BLAS/LAPACK 等,环境配置稍显复杂,因此,记录环境配置过程,以备后用。
依赖关系
SLEPc 是一个开源项目,可以在这里找到 https://github.com/firedrakeproject/slepc/ ,有非常详细的使用说明(documentation),使用友好。SLEPc 依赖于 PETSc,而 PETSc 依赖于 BLAS/LAPACK,因此,我们需要一一安装依赖项。
BLAS/LAPACK
BLAS(Basic Linear Algebra Subprograms)定义了一系列矩阵、向量之间的基础运算的接口标准(API),Netlib 实现了 BLAS 的这些接口,得到的库也叫 BLAS。以 BLAS 为基础,Netlib 增加了更多高级的矩阵、向量运算,如分解、求逆、特征值等,并且实现了这些高级接口,于是有了 LAPACK(Linear Algebra PackAage)。这两个库都是用 Fortran 语言开发的(另外插一句,CBLAS 和 CLAPACK 是 BLAS 和 LAPACK 的 C 语言接口)。
默认安装方式 [1] 为(没有试过... 应该不会有什么问题...)
1 | sudo apt-get install libblas-dev |
1 | /usr/lib/x86_64-linux-gnu/libblas.a |
因为我需要安装在自定义路径中,所以下面进行一些自定义配置,如果不需要自定义路径,可以直接跳到 下一节。
安装 Fortran 语言的编译器 gfortran
1 | sudo apt-get install gfortran |
安装 FFTW [2]
i. 下载 FFTW
http://www.fftw.org/download.html
ii. 安装 FFTW
1 | tar -zxvf fftw-3.3.10.tar.gz |
安装 BLAS/LAPACK [2]
i. 确保 cmake 和 gfortran 已经安装
ii. 下载 LAPACK
https://netlib.org/lapack/
幸运的是 LAPACK 中已经包含了 BLAS,所以不用重复下载。
iii. 安装 LAPACK
解压
1 | tar -zxvf lapack-3.11.tar.gz |
make.inc
文件1 | cp make.inc.example make.inc |
make.inc
里的内容,否则需要根据系统环境和编译器修改文件里对应的选项。LAPACK 依赖 BLAS,在编译 LAPACK 前需要编译 BLAS 包,而默认并不编译,因此,需要修改一下makefile
1 | gedit Makefile |
1 | lib: lapacklib tmglib |
1 |
|
1 | make |
LAPACKE
目录并再次编译1 | cd LAPACKE |
lapack-3.11
目录下生成如下四个静态库,liblapack.a, liblapacke.a, librefblas.a, libtmglib.a
则表示编译成功,将这四个静态库拷贝到自定义路径下的 lib
路径,同时将 LAPACKE/include
目录下的头文件拷贝到自定义路径下的 include
目录。安装 MPICH
PETSc 还依赖于 MPICH。
i. 下载 MPICH
https://www.mpich.org/downloads/
ii. 安装 MPICH
一般情况使用默认安装模式就可以了,如果需要自定义安装,可以查看 这里。 以下为默认安装的方式。
解压
1 | tar -zxvf mpich-4.1.1.tar.gz |
1 | ./configure --prefix=/your/path/to/install 2>&1 | tee c.txt |
~/.bashrc
,添加如下命令并重新打开 shell1 | export PATH=/your/path/to/install/bin:$PATH; |
/your/path/to/install/bin
。1 | which mpicc |
1 | # to run the CPI example with 'n' processes on your local machine |
PETSc 和 SLEPc 版本
由于 SLEPc 是基于 PETSc 的,所以需要先安装 PETSc,再安装 SLEPc。与此同时,要确保所下载的 PETSc 和 SLEPc 的版本能够符合 版本对应表。
安装 PETSc
i. 下载 PETSc
https://petsc.org/release/install/download/
ii. 安装 PETSc
1 | tar -zxvf petsc-3.18.5.tar.gz |
include
目录下的所有文件拷贝到安装目录 include
下指定位置,同时将 arch-linux-c-debug/include
目录下的所有头文件拷贝到安装目录 include
下指定位置,将 arch-linux-c-debug/lib/libpetsc.a
拷贝到安装目录 lib
下指定位置。安装 SLEPc
i. 下载 SLEPc
https://slepc.upv.es/download/
ii. 安装 SLEPc
1 | tar -zxvf slepc-3.18.3.tar.gz |
include
目录下的所有文件拷贝到安装目录 include
下指定位置,【重要】 同时,将 arch-linux-c-debug/include/slepcconf.h
拷贝到安装目录 include
下指定位置。将 arch-linux-c-debug/lib/libslepc.a
拷贝到安装目录 lib
下指定位置。可能遇到的问题
在使用 SLEPc 时,编译工程的过程中,需要添加的头文件路径有
1 | .../mpich/include |
1 | libslepc.a |
如果遇到了 undefined reference to MPI_XXXX
的错误,还必须添加 OPENMPI 的头文件和库 [3]
1 | # 添加头文件路径(或者你的 openmpi 安装路径) |
sudo apt-get install openmpi
,但是需要注意版本。如果遇到了 undefined reference to symbol 'udev_device_unref@@LIBUDEV_183'
的问题,需要添加 libudev.so
。用locate libudev
找到路径,然后添加库路径
1 | # 路径 |
如果遇到了undefined reference to symbol '__atomic_fetch_xor_16@@LIBATOMIC_1.0'
,需要添加
1 | # 链接选项 |
如果遇到了undefined reference to '_gfortran_concat_string'
,需要添加
1 | # 链接选项 |
如果遇到了undefined reference to XSetForeground (Maybe Some Drawing Functions)
,需要添加
1 | # 链接选项 |
参考
- [1] Ubuntu BLAS/LAPACK 安装
- [2] 非 ROOT 路径安装 BLAS/LAPACK
- [3] undefined reference to MPI_Init 解决办法