外观
本地科学计算环境安装顺序与分层管理
最近重新整理了一套本地科学计算开发环境安装过程,主要记录
- 各种库的安装顺序和配置细节
- 系统包和手工编译的科学计算库的分层管理
我当前的环境是:源码在 ~/software,一部分基础依赖通过 apt 安装在 /usr 下,自己维护的科学计算栈安装在 /opt 下,上层程序包括 mfem、phg-0.9.9 和 polaris。
安装顺序
按下面顺序安装:
gmp,mpfr,mprealeigen3openblashdf5,netcdf,pnetcdfpetscp4estphg-0.9.9polaris
这个顺序基本对应依赖关系:先确认系统基础库,再装并行 I/O 和求解库,最后装有限元框架和应用代码。
路径约定
推荐把源码和安装路径分开:
- 源码目录:
~/software - 系统基础库:
/usr - 手工编译科学计算栈:
/opt
建议直接分成两层管理。
第一层是系统层,保留 apt 安装的基础依赖:
mpigmp,mpfr,mprealhdf5,netcdf,pnetcdf- 编译器、Python、CMake 之类的工具
这些都由系统包管理器维护,路径通常就在 /usr 下。
第二层是项目层,也就是自己编译、自己控版本的科学计算库:
petscmfemp4estphg-0.9.9polaris
一套比较清楚的路径变量可以写成:
MPI_PREFIX=/usr
GMP_PREFIX=/usr
MPFR_PREFIX=/usr
MPREAL_PREFIX=/usr
EIGEN3_PREFIX=/usr/include/eigen3
OPENBLAS_PREFIX=/usr/
HDF5_PREFIX=/usr
NETCDF_PREFIX=/usr
PNETCDF_PREFIX=/usr
PETSC_PREFIX=/opt/petsc这样做的好处是:
/usr里的包交给apt管理,升级和依赖关系更稳/opt里的科学计算库版本由自己控制,不容易被系统更新打乱- 上层程序在排查头文件、库路径和 ABI 问题时更容易定位
基础高精度库
gmp, mpfr, mpreal
直接用 apt 安装的版本就好,通常也比较新了,不需要自己再编一份。
sudo apt update
sudo apt install -y libgmp-dev libmpfr-devmpreal 是一个头文件库,来自 Github, 可以直接克隆到本地:
cd ~/software
git clone https://github.com/advanpix/mpreal然后拷贝 mpreal.h 到系统头文件目录即可:
sudo cp mpreal/mpreal.h /usr/include/如果需要确认:
ls /usr/include/x86_64-linux-gnu/gmp.h
ls /usr/lib/x86_64-linux-gnu/libgmp.so
ls /usr/include/mpfr.h
ls /usr/lib/x86_64-linux-gnu/libmpfr.so
ls /usr/include/mpreal.h线性代数与模板库
Eigen3
Eigen3 也是一个纯头文件库,直接使用系统 apt 提供的版本。
sudo apt install -y libeigen3-dev这样安装之后,eigen3 的头文件路径就是:
/usr/include/eigen3OpenBLAS
OpenBLAS 给 petsc 和其他上层库提供 BLAS/LAPACK。
通过 apt 安装:
sudo apt install -y libopenblas-dev安装后应该是这样:
/usr/include/x86_64-linux-gnu/cblas.h
-> /etc/alternatives/cblas.h-x86_64-linux-gnu
-> /usr/include/x86_64-linux-gnu/openblas-pthread/cblas.h
/usr/lib/x86_64-linux-gnu/libopenblas.so
-> /etc/alternatives/libopenblas.so-x86_64-linux-gnu
-> /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblas.so并行 I/O 与求解库
HDF5、NetCDF、PnetCDF
可以把三者关系粗略理解成:
hdf5:通用底层数据格式和库netcdf:更高层、更面向科学变量语义的数据接口pnetcdf:面向 MPI 并行程序的 classic NetCDF 并行 I/O 库
从依赖关系上看:
pnetcdf不要求先安装hdf5, 也不要求先安装netcdf- 如果你要的是
netcdf-4功能,那么通常是netcdf依赖hdf5
在Ubuntu上,可以直接用 apt 安装这三套库.
sudo apt install -y libhdf5-dev libnetcdf-dev libpnetcdf-dev安装后可以检查:
nc-config --version
nc-config --cflags
nc-config --libs
ls /usr/include/netcdf.h输出如下:
netCDF 4.9.2
-I/usr/include -I/usr/include/hdf5/serial
-L/usr/lib/x86_64-linux-gnu -L/usr/lib/x86_64-linux-gnu/hdf5/serial -lnetcdf
/usr/include/netcdf.h如果以后明确需要并行版 netcdf,Ubuntu 里也有单独的并行开发包:
sudo apt install -y libhdf5-mpi-dev libnetcdf-mpi-devMPI 环境确认
这里先把 MPI 环境确认清楚,后面这套科学计算栈里,大部分包在编译时都会直接或间接依赖 MPI。最重要的原则是:所有需要 MPI 的包都必须统一使用同一套 MPI 编译器包装器来编译。如果 petsc 用的是一套 MPI,p4est、phg、polaris 又用的是另一套 MPI,那么头文件、库路径、ABI 和运行时链接都可能不一致,最后往往会出现很难排查的兼容性问题。
如果这里采用的是系统 apt 安装的 MPI,那么后面整套栈都应统一使用 /usr 下这套 MPI,也就是统一使用 mpicc、mpicxx、mpifort 这几个编译器包装器。
可以先确认:
which mpicc
which mpicxx
which mpifort
mpicc -show
ldconfig -p | grep libmpi.so理想情况下,一般会看到:
/usr/bin/mpicc
/usr/bin/mpicxx
/usr/bin/mpifort
gcc -I/usr/lib/x86_64-linux-gnu/openmpi/include -I/usr/lib/x86_64-linux-gnu/openmpi/include/openmpi -L/usr/lib/x86_64-linux-gnu/openmpi/lib -lmpi
libmpi.so.40 (libc6,x86-64) => /lib/x86_64-linux-gnu/libmpi.so.40
libmpi.so (libc6,x86-64) => /lib/x86_64-linux-gnu/libmpi.soPETSc
PETSc 同样可以用 apt 安装,但通常版本比较旧,PETSc 是高性能计算库的集大成者,可以用它来管理很多第三方库,比如 superlu_dist、mumps、hypre、metis 等等,如果用系统包管理器安装 PETSc,不会自动下载这些库。所以推荐自己从源码安装 PETSc,这样在配置阶段就可以直接让 PETSc 下载和编译这些常用的并行求解器和分区库,后续维护也更方便。如果源码是从 Github 克隆的,建议先切到一个稳定的 release tag,比如:
cd ~/software/petsc
git checkout v3.20.0我的 PETSc 配置命令是:
./configure \
--prefix=/opt/petsc \
--with-cc=mpicc \
--with-cxx=mpicxx \
--with-fc=mpifort \
--download-superlu_dist \
--download-mumps \
--download-hypre \
--download-metis \
--download-parmetis \
--download-scalapack \
PETSC_ARCH=arch-linux-c-debug \
PETSC_DIR=/home/wugs/software/petsc
make -j$(nproc)
make install这里没有再显式写 --with-blaslapack-dir,因为 Ubuntu 会通过系统默认的 blas/lapack alternatives 解析 -lblas 和 -llapack。如果当前系统默认已经切到 OpenBLAS,那么 PETSc 最终还是会用 apt 安装的那套 OpenBLAS。
可以先确认系统当前默认指向:
update-alternatives --display libblas.so-x86_64-linux-gnu
update-alternatives --display liblapack.so-x86_64-linux-gnu
readlink -f /usr/lib/x86_64-linux-gnu/libblas.so
readlink -f /usr/lib/x86_64-linux-gnu/liblapack.so在我这台机器上,最后解析到的是:
/usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so
/usr/lib/x86_64-linux-gnu/openblas-pthread/liblapack.so有限元软件
PHG-0.9.9
这里需要先把 p4est 装好,再安装启用 p4est 的 phg, 因为 phg 的非拟合模块需要 p4est 提供的四叉树和八叉树网格。
配置并安装 p4est:
cd ~/software/p4est-2.8.7
./configure \
--prefix=/opt/p4est-2.8.7 \
--enable-mpi
make -j$(nproc)
make install新版的 hypre 不再提供 krylov.h,需要修改 phg 的 src/solver-krylov.c,把 #include "krylov.h" 改成 #include "HYPRE_krylov.h",然后再安装 phg。 然后再配置 phg:
./configure \
--prefix=/home/wugs/software/phg-0.9.9/install \
--with-p4est-dir=/opt/p4est-2.8.7 \
--disable-shared
make -j$(nproc)
make install基于 PHG 的 Polaris
配置并安装 Polaris:
cd ~/software/phgism
mkdir install
./configure \
--prefix=/home/wugs/software/phgism/install \
--with-netcdf-incdir=/usr/include \
--with-netcdf-libdir=/usr/lib/x86_64-linux-gnu \
--with-pnetcdf-incdir=/usr/include \
--with-pnetcdf-libdir=/usr/lib/x86_64-linux-gnu \
--with-hdf5-libdir=/usr/lib/x86_64-linux-gnu/hdf5/serial \
--disable-shared
make -j$(nproc)
make install
make -C ice-sheet/src依赖关系总结
这套环境里最关键的依赖关系:
mpfr依赖gmpmpreal依赖mpfr和gmppetsc依赖openblasphg常配合petsc,可选p4est
版权所有
版权归属:Guisong Wu