在 Linux 上编译 VASP

预编译包在云上通常不可用(CPU 指令集、MPI 版本、库路径都对不上),所以「自己编译」是上云跑 VASP 的第一道门槛。它不难,但有几个坑几乎人人踩一遍。

2026-10-17 · 约 11 分钟读完

一、先确认硬件能跑什么指令集

编译优化选项必须匹配 CPU,否则要么跑不起来(非法指令),要么白白浪费一半性能。

lscpu | grep -o 'avx[0-9a-z_]*' | sort -u

输出里有 avx512f 就可以开 -xHost 或 -xCORE-AVX512;只有 avx2 就必须降到 -xCORE-AVX2。同一个二进制拿到别的机器上可能直接 Illegal instruction,所以编译环境和运行环境要一致——这一点在云上尤其重要:你在一台实例上编译好,快照做成镜像,之后所有实例都用同一个镜像。

二、依赖只需要三样

# Alibaba Cloud Linux / OpenAnolis 上装 gfortran 工具链(示例)
dnf install -y gcc gcc-gfortran make openmpi openmpi-devel environment-modules
# 或使用 Intel oneAPI(需要从官方仓库安装)
dnf install -y intel-oneapi-compiler-fortran intel-oneapi-mkl-devel intel-oneapi-mpi-devel
装完确认 which mpif90 指向的是你要用的那个 MPI。机器上同时存在 OpenMPI 和 Intel MPI 时,mpif90 -show 能告诉你它实际调用了哪个编译器与库。

三、Makefile.include 里真正要改的几行

VASP 6 的 makefile.include 通常从 arch/ 目录里挑一个模板改。必改项:

# 1) 编译器与 MPI 包装器
FC = mpif90
FCL = mpif90
CC = mpicc

# 2) 预处理与 Fortran 标准
CPP_OPTIONS = -DHOST=\"LinuxIFC\" -DMPI -DMPI_BLOCK=8000 -Duse_collective \
              -DCACHE_SIZE=4000 -Davoidalloc -Dvasp6 -Duse_bse_te \
              -Dtbdyn -Dfock_dblbuf -DUSE_FFTWF -DscaLAPACK

# 3) 优化与库(Intel 工具链示例)
FFLAGS = -w -O3 -xHost -I$(MKLROOT)/include
FFLAGS += $(if $(findstring gfortran,$(FC)),-ffree-form -ffree-line-length-none,)
BLAS = -L$(MKLROOT)/lib/intel64 -lmkl_intel_lp64 -lmkl_sequential -lmkl_core
LAPACK = $(BLAS)
SCALAPACK = -lmkl_scalapack_lp64 -lmkl_blacs_intelmpi_lp64
OBJECTS = fftw3.o

几个实际会咬人的点:

现象原因处理
undefined reference to dgemm_BLAS/LAPACK 链接顺序或库名错把 $(BLAS) 放在对象文件之后;确认 lp64 与 ilp64 用对
非法指令 运行时崩溃编译机 CPU 指令集高于运行机降到 -xCORE-AVX2,或统一用同一镜像
error: unrecognized command line option '-xHost'用的是 gfortran 而不是 ifxgfortran 用 -march=native -O3
链接 scalapack 报错没开 -DscaLAPACK 或库没装不需要并行 LAPACK 时直接去掉这两项
运行时 Segmentation fault内存不足 / MPI 库混用先单核跑通,再上 MPI

四、编译与验证

# 解压后进入目录
cp arch/makefile.include.linux_intel makefile.include
# 按上一节修改后编译(并行 make 加快速度)
make DEPS=1 -j 8 std gpu ncl 2>&1 | tee build.log

编译成功的标志是 bin/ 下出现 vasp_std、vasp_gam、vasp_ncl。接着用自带的小算例跑一遍,确认三件事:单核能结束、MPI 多核结果一致、OUTCAR 里最后几行是正常结束而不是 Error。

# 一个快速自检:跑 5 个离子步,看是否正常收敛退出
mpirun -np 8 vasp_std > run.log 2>&1; tail -20 run.log

五、云上的工程建议

  1. 编译一次,做成自定义镜像:之后所有实例都用它,避免每台机器重新踩一遍坑。
  2. 把 bin/ 放系统盘固定路径(如 /opt/vasp6/bin),写进 PATH。
  3. 保留 build.log 与 makefile.include:换机器、换工具链时能直接对照。
  4. 用同一镜像跑抢占式实例:省的不只是时间,还有"环境不一致导致结果不一致"的麻烦。
相关阅读:一台新 ECS 十分钟配成 DFT 计算节点:可复现的初始化脚本 · 在云服务器上跑 VASP 的完整流程:选规格、装环境、编译、跑第一个算例 · 每月 300 / 1000 / 3000 元预算,在云上能跑多少计算 · INCAR 检查器 · 配置推荐器 · 常见问题 · 离线单文件估算器 · 内存与 WAVECAR 估算器 · core-hour 机时估算器

编译完,接着算成本

同样的输入,不同的实例规格费用能差出一倍。先用估算器把机时定下来。

打开 core-hour 估算器 查看实例规格

要买的话:先点上面的推广链接登录或注册,再回到本页点一次同一条链接——阿里云按「两次点击」建立推广关联(关联期 90 天),你的价格不受任何影响。

本站部分链接为推广链接,你购买的价格不变。编译选项与库版本以你实际安装的 VASP 与工具链文档为准。