常用科学计算软件的安装与编译
- 1806
- 15 min
如何安装常用的第一性原理计算软件,是刚开始接触第一性原理计算会碰到的一个比较大的问题。网上教程很多,但不少已经停留在很早的版本;真正到服务器或集群上编译时,最容易出错的往往不是软件本身,而是编译器、MPI、BLAS/LAPACK、FFT、HDF5 这些依赖混在了一起。
这篇文章记录一套相对稳妥的流程。它不追求覆盖所有软件,而是先把工具链讲清楚,再以 Quantum ESPRESSO、Wannier90 和 WannierTools 为例。
编译器与工具链
大多数第一性原理和科学计算程序由 Fortran、C 或 C++ 编写。拿到源码后,我们需要在自己的机器上生成二进制可执行文件。这个过程至少需要:
- 编译器:
gcc/g++/gfortran、icx/icpx/ifx、clang/flang等。 - 构建工具:
make、cmake、ninja。 - MPI:OpenMPI、MPICH、Intel MPI 等。
- 数学库:BLAS、LAPACK、ScaLAPACK、FFTW、MKL、OpenBLAS。
- 可选库:HDF5、Libxc、ELPA、ARPACK 等。
我的建议是:不要在同一个 shell 里混用多套编译器和 MPI。比如用 Intel 编译器时尽量配 Intel MPI/MKL;用 GCC 时尽量配 OpenMPI/OpenBLAS。混搭当然可以,但排错成本会明显变高。
Intel oneAPI
原来的 Intel Parallel Studio XE 已经被 Intel oneAPI 工具链取代。oneAPI 通常分成 Base Toolkit 和 HPC Toolkit:前者包含 oneMKL 等基础库,后者包含 Fortran 编译器、MPI 和 HPC 相关工具。
截至 2026 年 4 月,Intel Fortran Compiler Classic ifort 已在 oneAPI 2025 中停止提供,新的主线 Fortran 编译器是 LLVM 后端的 ifx。因此新环境中应优先测试:
which ifx
which icx
which mpiifx
which mpiicx安装完成后,每次使用前需要初始化环境。旧布局通常是:
source /opt/intel/oneapi/setvars.shoneAPI 2024 之后也可能看到统一目录布局:
source /opt/intel/oneapi/<toolkit-version>/oneapi-vars.sh如果是个人用户安装在家目录,则路径可能是:
source ~/intel/oneapi/setvars.sh初始化后检查:
ifx --version
icx --version
mpiifx --version一个最小 MPI 测试可以写成:
program hello
use mpi
implicit none
integer :: ierr, rank, size
call MPI_Init(ierr)
call MPI_Comm_rank(MPI_COMM_WORLD, rank, ierr)
call MPI_Comm_size(MPI_COMM_WORLD, size, ierr)
print *, 'Hello from rank', rank, 'of', size
call MPI_Finalize(ierr)
end program hello编译运行:
mpiifx hello.f90 -o hello.x
mpirun -np 4 ./hello.x如果这一步失败,后面编译 Quantum ESPRESSO 或 Wannier90 大概率也会失败。
GNU/OpenMPI/OpenBLAS 环境
如果没有 Intel 工具链,GNU 工具链通常更容易获得。Arch Linux 上可以准备:
sudo pacman -S base-devel gcc-fortran cmake ninja git pkgconf \
openmpi openblas lapack fftw hdf5 arpackDebian/Ubuntu 上可以准备:
sudo apt install build-essential gfortran cmake ninja-build git pkg-config \
openmpi-bin libopenmpi-dev libopenblas-dev liblapack-dev \
libfftw3-dev libhdf5-dev libarpack2-dev检查 MPI wrapper:
mpif90 --show
mpicc --show这里显示的底层编译器应该和你预期一致。如果 mpif90 --show 指向一个旧编译器,而你又在环境变量里手动设了新的 FC,就很容易出现 ABI 或 Fortran module 不兼容。
环境变量和排错习惯
编译前我通常先记录以下信息:
which gcc gfortran mpif90 cmake make
gcc --version
gfortran --version
mpif90 --show如果程序运行时报找不到共享库:
ldd ./pw.x可以快速看到它到底链接到了哪个 libmpi.so、libmkl_*.so 或 libopenblas.so。在集群上更推荐使用 module 系统管理环境:
module avail
module load oneapi
module list不要把很多 source 和 export LD_LIBRARY_PATH=... 长期堆在 .bashrc 里。那样短期方便,长期会让不同项目互相污染。
Quantum ESPRESSO
Quantum ESPRESSO 官方文档同时支持 make 和 CMake。新版本更推荐从干净的 build 目录开始。
下载源码:
git clone https://gitlab.com/QEF/q-e.git
cd q-e
git checkout qe-7.5最传统的方式是:
mkdir build
cd build
../configure
make all -j$(nproc)如果 MPI 环境正确,configure 会自动尝试生成 MPI 版本;如果想启用 OpenMP:
../configure --enable-openmp
make all -j$(nproc)CMake 方式更适合显式指定编译器和选项:
cmake -S . -B build \
-DCMAKE_C_COMPILER=mpicc \
-DCMAKE_Fortran_COMPILER=mpif90 \
-DQE_ENABLE_MPI=ON \
-DQE_ENABLE_OPENMP=ON
cmake --build build -j$(nproc)Intel oneAPI 环境下可以尝试:
cmake -S . -B build \
-DCMAKE_C_COMPILER=mpiicx \
-DCMAKE_Fortran_COMPILER=mpiifx \
-DQE_ENABLE_MPI=ON \
-DQE_ENABLE_OPENMP=ON
cmake --build build -j$(nproc)编译完成后检查:
build/bin/pw.x -h运行时要控制 MPI 进程和 OpenMP 线程的乘积。比如一个节点 64 核,可以从比较保守的组合开始:
export OMP_NUM_THREADS=2
mpirun -np 32 pw.x -in scf.in > scf.out如果不知道怎么分配,先用纯 MPI,即 OMP_NUM_THREADS=1。
Wannier90
Wannier90 有两种常见用法:
- 独立程序:读取
.win、.amn、.mmn、.eig等文件,生成最大局域化 Wannier 函数。 - 库模式:由第一性原理程序直接调用 Wannier90 library。
源码编译通常可以从:
git clone https://github.com/wannier-developers/wannier90.git
cd wannier90如果使用传统 make,需要选择或修改对应的 make.inc:
cp config/make.inc.gfort make.inc
make -j$(nproc)如果要编译动态库:
make dynlibMPI 版本需要保证 Wannier90 和调用它的程序使用同一套 MPI。Fortran module 文件和 MPI communicator 类型对编译器/MPI 版本都很敏感,混用时常见报错是 .mod 文件读不出来,或者 mpi_comm 类型不匹配。
WannierTools
WannierTools 主要读取 Wannier90 生成的 wannier90_hr.dat,然后计算拓扑性质、表面态、边缘态等。必要依赖包括 Fortran 编译器、MPI、BLAS/LAPACK、ARPACK。
git clone https://github.com/quanshengwu/wannier_tools.git
cd wannier_tools/src编译前选择合适的 Makefile。串行 GNU 环境中重点检查:
FC = gfortran
LIBS = -lopenblas -llapack -larpack如果使用 Intel MKL,可以借助 Intel 的 MKL Link Line Advisor 生成链接参数,或者在 oneAPI 环境中使用相应示例 Makefile。编译后可执行文件通常会复制到:
wannier_tools/bin/wt.x运行目录至少包含:
wt.in
wannier90_hr.dat然后:
wt.x或:
mpirun -np 4 wt.x常见错误
找不到 Fortran 编译器
先检查:
which gfortran ifx mpif90 mpiifx如果 mpif90 存在但底层编译器不对,看:
mpif90 --show编译通过但运行找不到库
用:
ldd ./program.x检查缺的是 MPI、MKL 还是 OpenBLAS。Intel oneAPI 环境通常需要重新 source setvars.sh。
MPI 运行多个串行程序
如果编译的是串行程序,却用 mpirun -np 4 启动,就会变成四个互不通信的独立进程。判断方法是看程序输出中是否真的识别 MPI rank。
OpenMP 线程过多
很多数学库默认会自己开线程。如果 MPI 进程数已经很多,又让 MKL/OpenBLAS/OpenMP 自动开满线程,会严重超卖 CPU。可以先固定:
export OMP_NUM_THREADS=1
export MKL_NUM_THREADS=1
export OPENBLAS_NUM_THREADS=1确认正确后再调优。
我的建议
新机器上不要一开始就编译完整大软件栈。先做三步:
- 编译并运行一个 MPI hello world。
- 编译一个只链接 BLAS/LAPACK 的小程序。
- 再编译 Quantum ESPRESSO 或 Wannier90。
这样一旦出错,能迅速判断是编译器、MPI、数学库,还是目标软件本身的问题。
参考资料
- Intel, Get Started with the Intel oneAPI HPC Toolkit for Linux.
- Intel, Intel Fortran Compiler Release Notes 2025.
- Quantum ESPRESSO, User’s Guide: Installation.
- Quantum ESPRESSO, Building with make.
- Wannier90, Library mode documentation.
- WannierTools, Installation of WannierTools.