常用科学计算软件的安装与编译

  • 1806
  • 15 min

如何安装常用的第一性原理计算软件,是刚开始接触第一性原理计算会碰到的一个比较大的问题。网上教程很多,但不少已经停留在很早的版本;真正到服务器或集群上编译时,最容易出错的往往不是软件本身,而是编译器、MPI、BLAS/LAPACK、FFT、HDF5 这些依赖混在了一起。

这篇文章记录一套相对稳妥的流程。它不追求覆盖所有软件,而是先把工具链讲清楚,再以 Quantum ESPRESSO、Wannier90 和 WannierTools 为例。

编译器与工具链

大多数第一性原理和科学计算程序由 Fortran、C 或 C++ 编写。拿到源码后,我们需要在自己的机器上生成二进制可执行文件。这个过程至少需要:

  • 编译器:gcc/g++/gfortranicx/icpx/ifxclang/flang 等。
  • 构建工具:makecmakeninja
  • 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。因此新环境中应优先测试:

bash
which ifx
which icx
which mpiifx
which mpiicx

安装完成后,每次使用前需要初始化环境。旧布局通常是:

bash
source /opt/intel/oneapi/setvars.sh

oneAPI 2024 之后也可能看到统一目录布局:

bash
source /opt/intel/oneapi/<toolkit-version>/oneapi-vars.sh

如果是个人用户安装在家目录,则路径可能是:

bash
source ~/intel/oneapi/setvars.sh

初始化后检查:

bash
ifx --version
icx --version
mpiifx --version

一个最小 MPI 测试可以写成:

text
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

编译运行:

bash
mpiifx hello.f90 -o hello.x
mpirun -np 4 ./hello.x

如果这一步失败,后面编译 Quantum ESPRESSO 或 Wannier90 大概率也会失败。

GNU/OpenMPI/OpenBLAS 环境

如果没有 Intel 工具链,GNU 工具链通常更容易获得。Arch Linux 上可以准备:

bash
sudo pacman -S base-devel gcc-fortran cmake ninja git pkgconf \
  openmpi openblas lapack fftw hdf5 arpack

Debian/Ubuntu 上可以准备:

bash
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:

bash
mpif90 --show
mpicc --show

这里显示的底层编译器应该和你预期一致。如果 mpif90 --show 指向一个旧编译器,而你又在环境变量里手动设了新的 FC,就很容易出现 ABI 或 Fortran module 不兼容。

环境变量和排错习惯

编译前我通常先记录以下信息:

bash
which gcc gfortran mpif90 cmake make
gcc --version
gfortran --version
mpif90 --show

如果程序运行时报找不到共享库:

bash
ldd ./pw.x

可以快速看到它到底链接到了哪个 libmpi.solibmkl_*.solibopenblas.so。在集群上更推荐使用 module 系统管理环境:

bash
module avail
module load oneapi
module list

不要把很多 sourceexport LD_LIBRARY_PATH=... 长期堆在 .bashrc 里。那样短期方便,长期会让不同项目互相污染。

Quantum ESPRESSO

Quantum ESPRESSO 官方文档同时支持 make 和 CMake。新版本更推荐从干净的 build 目录开始。

下载源码:

bash
git clone https://gitlab.com/QEF/q-e.git
cd q-e
git checkout qe-7.5

最传统的方式是:

bash
mkdir build
cd build
../configure
make all -j$(nproc)

如果 MPI 环境正确,configure 会自动尝试生成 MPI 版本;如果想启用 OpenMP:

bash
../configure --enable-openmp
make all -j$(nproc)

CMake 方式更适合显式指定编译器和选项:

bash
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 环境下可以尝试:

bash
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)

编译完成后检查:

bash
build/bin/pw.x -h

运行时要控制 MPI 进程和 OpenMP 线程的乘积。比如一个节点 64 核,可以从比较保守的组合开始:

bash
export OMP_NUM_THREADS=2
mpirun -np 32 pw.x -in scf.in > scf.out

如果不知道怎么分配,先用纯 MPI,即 OMP_NUM_THREADS=1

Wannier90

Wannier90 有两种常见用法:

  1. 独立程序:读取 .win.amn.mmn.eig 等文件,生成最大局域化 Wannier 函数。
  2. 库模式:由第一性原理程序直接调用 Wannier90 library。

源码编译通常可以从:

bash
git clone https://github.com/wannier-developers/wannier90.git
cd wannier90

如果使用传统 make,需要选择或修改对应的 make.inc

bash
cp config/make.inc.gfort make.inc
make -j$(nproc)

如果要编译动态库:

bash
make dynlib

MPI 版本需要保证 Wannier90 和调用它的程序使用同一套 MPI。Fortran module 文件和 MPI communicator 类型对编译器/MPI 版本都很敏感,混用时常见报错是 .mod 文件读不出来,或者 mpi_comm 类型不匹配。

WannierTools

WannierTools 主要读取 Wannier90 生成的 wannier90_hr.dat,然后计算拓扑性质、表面态、边缘态等。必要依赖包括 Fortran 编译器、MPI、BLAS/LAPACK、ARPACK。

bash
git clone https://github.com/quanshengwu/wannier_tools.git
cd wannier_tools/src

编译前选择合适的 Makefile。串行 GNU 环境中重点检查:

makefile
FC = gfortran
LIBS = -lopenblas -llapack -larpack

如果使用 Intel MKL,可以借助 Intel 的 MKL Link Line Advisor 生成链接参数,或者在 oneAPI 环境中使用相应示例 Makefile。编译后可执行文件通常会复制到:

text
wannier_tools/bin/wt.x

运行目录至少包含:

text
wt.in
wannier90_hr.dat

然后:

bash
wt.x

或:

bash
mpirun -np 4 wt.x

常见错误

找不到 Fortran 编译器

先检查:

bash
which gfortran ifx mpif90 mpiifx

如果 mpif90 存在但底层编译器不对,看:

bash
mpif90 --show

编译通过但运行找不到库

用:

bash
ldd ./program.x

检查缺的是 MPI、MKL 还是 OpenBLAS。Intel oneAPI 环境通常需要重新 source setvars.sh

MPI 运行多个串行程序

如果编译的是串行程序,却用 mpirun -np 4 启动,就会变成四个互不通信的独立进程。判断方法是看程序输出中是否真的识别 MPI rank。

OpenMP 线程过多

很多数学库默认会自己开线程。如果 MPI 进程数已经很多,又让 MKL/OpenBLAS/OpenMP 自动开满线程,会严重超卖 CPU。可以先固定:

bash
export OMP_NUM_THREADS=1
export MKL_NUM_THREADS=1
export OPENBLAS_NUM_THREADS=1

确认正确后再调优。

我的建议

新机器上不要一开始就编译完整大软件栈。先做三步:

  1. 编译并运行一个 MPI hello world。
  2. 编译一个只链接 BLAS/LAPACK 的小程序。
  3. 再编译 Quantum ESPRESSO 或 Wannier90。

这样一旦出错,能迅速判断是编译器、MPI、数学库,还是目标软件本身的问题。

参考资料