在 Linux 上编译 VASP
预编译包在云上通常不可用(CPU 指令集、MPI 版本、库路径都对不上),所以「自己编译」是上云跑 VASP 的第一道门槛。它不难,但有几个坑几乎人人踩一遍。
一、先确认硬件能跑什么指令集
编译优化选项必须匹配 CPU,否则要么跑不起来(非法指令),要么白白浪费一半性能。
lscpu | grep -o 'avx[0-9a-z_]*' | sort -u
输出里有 avx512f 就可以开 -xHost 或 -xCORE-AVX512;只有 avx2 就必须降到 -xCORE-AVX2。同一个二进制拿到别的机器上可能直接 Illegal instruction,所以编译环境和运行环境要一致——这一点在云上尤其重要:你在一台实例上编译好,快照做成镜像,之后所有实例都用同一个镜像。
二、依赖只需要三样
- Fortran 编译器:gfortran(免费)或 Intel ifx/ifort(配 MKL 更快)。
- MPI:与编译器配套。用 Intel 工具链就用 Intel MPI,用 gfortran 就用 OpenMPI/MPICH——别混搭,混搭是九成链接错误的来源。
- 数学库:MKL(Intel)或 OpenBLAS + FFTW3。
# 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 而不是 ifx | gfortran 用 -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
五、云上的工程建议
- 编译一次,做成自定义镜像:之后所有实例都用它,避免每台机器重新踩一遍坑。
- 把
bin/放系统盘固定路径(如/opt/vasp6/bin),写进PATH。 - 保留
build.log与makefile.include:换机器、换工具链时能直接对照。 - 用同一镜像跑抢占式实例:省的不只是时间,还有"环境不一致导致结果不一致"的麻烦。
相关阅读:一台新 ECS 十分钟配成 DFT 计算节点:可复现的初始化脚本 · 在云服务器上跑 VASP 的完整流程:选规格、装环境、编译、跑第一个算例 · 每月 300 / 1000 / 3000 元预算,在云上能跑多少计算 · INCAR 检查器 · 配置推荐器 · 常见问题 · 离线单文件估算器 · 内存与 WAVECAR 估算器 · core-hour 机时估算器
编译完,接着算成本
同样的输入,不同的实例规格费用能差出一倍。先用估算器把机时定下来。
打开 core-hour 估算器 查看实例规格要买的话:先点上面的推广链接登录或注册,再回到本页点一次同一条链接——阿里云按「两次点击」建立推广关联(关联期 90 天),你的价格不受任何影响。
本站部分链接为推广链接,你购买的价格不变。编译选项与库版本以你实际安装的 VASP 与工具链文档为准。