软件安装实战系列· 04
Ubuntu 22.04 + AOCC 3.2.0 + AOCL 3.2.0 + OpenMPI 4.1.4
从编译链隔离、VASP 三版本构建,到 VTST 扩展与集群验收
适用系统 | Ubuntu 22.04;Ubuntu 24.04 可参考,命令和依赖版本需按实际环境调整 |
编译体系 | AMD AOCC 3.2.0 + AOCL 3.2.0 + AOCC 编译的 OpenMPI 4.1.4 |
编译目标 | vasp_std / vasp_gam / vasp_ncl,以及独立的 vasp_VTST |
环境管理 | Environment Modules 分层管理 compiler / math / mpi / env / vasp |
文章定位 | 可操作安装教程 + 原理解释 + 高频故障排查 + 交付验收标准 |
云算科技
高性能计算|科研服务|软件支持
版本:2026年7月
写在前面
在 AMD 服务器上编译 VASP,最容易产生的误解是:只要安装了 AOCC 和 AOCL,再把编译器名字换成 clang、flang,就算完成了“AMD 优化”。实际上,真正决定安装是否可靠的,不是软件名称,而是整条编译链是否一致。
AOCC 负责 C、C++ 和 Fortran 编译;AOCL 提供 BLAS、LAPACK、ScaLAPACK 与 FFTW 等数学库;OpenMPI 又必须由同一套 AOCC 编译。只要其中一环误用了系统 GCC、另一套 OpenMPI 或 Ubuntu 自带数学库,编译阶段就可能出现找不到库、符号未定义,甚至“能够编译但运行不稳定”的问题。
本文的核心目标 不仅让命令能够执行,还要让读者学会确认:clang/flang 来自哪里、mpif90 背后调用谁、AOCL 库到底安装在哪个目录、最终可执行文件运行时是否仍有缺失动态库。 |
本文基于 Ubuntu 22.04、AOCC 3.2.0、AOCL 3.2.0、OpenMPI 4.1.4 和 VASP 5.4.4 展开,并包含 VTST 扩展流程。我们已将环境探测、路径识别、编译配置、日志保存、modulefile 生成和验收测试封装为一键安装脚本,也可提供远程部署服务;但文章仍完整说明关键步骤,方便读者自行安装和判断结果。
文章目录
1.理解 AMD 编译路线:AOCC、AOCL、OpenMPI 与 VASP 的关系
2.安装包、授权与目录规划
3.安装基础工具和 Environment Modules
4.安装并验证 AOCC 3.2.0
5.安装 AOCL 3.2.0,并确认真实库路径
6.创建 AOCC、AOCL 与 OpenMPI modulefile
7.使用 AOCC 编译 OpenMPI 4.1.4
8.创建统一 AMD 编译环境 env/aocc/3.2.0
9.准备 VASP 5.4.4 源码与 makefile.include
10.编译 vasp_std、vasp_gam、vasp_ncl
11.创建 VASP modulefile 并完成运行验收
12.配置赝势库与 Si 最小测试
13.可选扩展:VASP 5.4.4 + VTST
14.Slurm 作业脚本示例
15.高频报错与排查顺序
16.一键安装脚本应具备的能力
17.最终验收清单与服务说明
1. 理解 AMD 编译路线:四层环境必须保持一致
组件 | 作用 | 本流程中的要求 |
AOCC | 提供 clang、clang++、flang | 三个编译器必须来自同一 AOCC 安装目录 |
AOCL | 提供 BLIS、libFLAME、ScaLAPACK、FFTW | 链接路径以实际 find 结果为准,不照抄不存在的统一 lib 目录 |
OpenMPI | 提供 mpicc、mpif90、mpirun | 必须使用 AOCC 编译,mpif90 后端必须是 flang |
VASP | 生成 std、gam、ncl 三种主程序 | makefile.include 只链接本套 AOCL 与 OpenMPI |
VTST | 为 NEB、Dimer 等过渡态功能提供源码补丁和脚本 | 复制原版源码后单独打补丁、单独编译 |
这条依赖关系可以理解成一列火车:AOCC 是机车,OpenMPI 与 AOCL 是中间车厢,VASP 是最后的载荷。每一节车厢都必须使用同一套连接标准。编译器混用通常不会在第一条命令就暴露,而是在 OpenMPI configure、VASP 链接或多进程运行时才出现。
判断环境是否干净的关键命令 不要只看 which mpif90。还要执行 mpif90 --showme:command,确认 MPI wrapper 最终调用的是 AOCC flang,而不是 gfortran。 |
2. 安装包、授权与目录规划
2.1 需要准备的安装包
aocc-compiler-3.2.0.taraocl-linux-aocc-3.2.0.tar.gzopenmpi-4.1.4.tar.gzvasp.5.4.4.tar.gzvtstcode-179.tgzvtstscripts.tgz # 可选,VTST 辅助脚本potpaw_PBE*.tar.gz # 可选,合法赝势库 |
授权说明 VASP 源码与赝势库属于授权内容,必须由用户或机构从合法渠道取得。安装服务可以完成本地编译、环境配置和测试,但不应代替用户提供未授权源码或赝势。 |
2.2 推荐目录
/opt/software # 安装包与临时源码/opt/AMD # AOCL 等 AMD 软件/opt/openmpi/4.1.4-aocc # AOCC 编译的 OpenMPI/opt/vasp/vasp.5.4.4 # VASP 原版源码/opt/vasp/vasp.5.4.4-vtst # VASP + VTST 源码/opt/vasp/potpaw_PBE # PBE 赝势库示例/opt/vtst/vtstcode-179 # VTST 编译补丁/opt/vtst/vtstscripts # VTST 辅助脚本/opt/modulefiles # modulefile 根目录 |
建议让源码目录、最终运行目录和 modulefile 保持固定关系。路径规划看似只是“整理文件”,实际上会直接影响后续升级、回滚、并存多版本和集群普通用户使用。
3. 安装基础工具和 Environment Modules
sudo apt updatesudo apt install -y \build-essential make perl python3 python3-pip \m4 autoconf automake libtool wget curl tar gzip bzip2 xz-utils \pkg-config libnuma-dev zlib1g-dev ca-certificates \environment-modulessource /etc/profile.d/modules.sh 2>/dev/null || \source /usr/share/modules/init/bashmodule --versionsudo mkdir -p /opt/software /opt/AMD /opt/openmpi /opt/vasp /opt/vtst /opt/modulefiles |
Environment Modules 的作用不是“让命令更短”,而是避免 AOCC、GNU、Intel、不同 MPI 和不同 VASP 版本永久堆叠在 PATH 与 LD_LIBRARY_PATH 中。需要切换软件时,先 module purge,再加载目标环境,比反复修改 ~/.bashrc 更可靠。
4. 安装并验证 AOCC 3.2.0
cd /opt/softwaretar -xvf aocc-compiler-3.2.0.tarcd aocc-compiler-3.2.0./install.sh# 安装器通常会生成环境初始化脚本,路径以实际结果为准source /opt/software/setenv_AOCC.shwhich clangwhich clang++which flangclang --versionflang --versionreadlink -f "$(which clang)"readlink -f "$(which flang)" |
安装完成后,必须确认三个编译器都来自 AOCC,而不是系统自带的 /usr/bin/clang 或 GNU gfortran。不同 AOCC 安装包生成的目录可能不同,因此后续 modulefile 中的 AOCC_HOME 应依据 readlink -f 的结果填写。
不要跳过 flang 独立测试 OpenMPI configure 失败时,先用 flang 编译一个最小 Fortran 程序。如果编译器本身无法生成并运行程序,继续排查 OpenMPI 没有意义。 |
cat > /tmp/test_aocc.f90 <<'EOF'program mainprint *, "AOCC Fortran works"end program mainEOFflang /tmp/test_aocc.f90 -o /tmp/test_aocc/tmp/test_aocc |
5. 安装 AOCL 3.2.0,并确认真实库路径
cd /opt/softwaretar -zxvf aocl-linux-aocc-3.2.0.tar.gzcd aocl-linux-aocc-3.2.0./install.sh -t /opt/AMD# 某些版本提供统一环境脚本source /opt/AMD/3.2.0/amd-libs.cfg 2>/dev/null || truefind /opt/AMD -name "libblis.so*" -o -name "libblis.a"find /opt/AMD -name "libflame.so*" -o -name "libflame.a"find /opt/AMD -name "libscalapack.so*" -o -name "libscalapack.a"find /opt/AMD -name "libfftw3.so*" -o -name "libfftw3.a"find /opt/AMD -name "fftw3.f" -o -name "fftw3.h" |
AOCL 不同版本或安装方式可能采用分组件目录,例如 amd-blis/lib、amd-libflame/lib、amd-scalapack/lib 和 amd-fftw/lib。不要假设所有库都在 /opt/AMD/3.2.0/lib。最可靠的方法是先查找,再把真实目录写入 modulefile 和 makefile.include。
变量 | 常见路径 | 对应库 |
AMDBLIS_LIB | /opt/AMD/3.2.0/amd-blis/lib | libblis |
AMDLIBFLAME_LIB | /opt/AMD/3.2.0/amd-libflame/lib | libflame |
AMDSCALAPACK_LIB | /opt/AMD/3.2.0/amd-scalapack/lib | libscalapack |
AMDFFTW_LIB | /opt/AMD/3.2.0/amd-fftw/lib | libfftw3 |
AMDFFTW_INC | /opt/AMD/3.2.0/amd-fftw/include | fftw3.h / fftw3.f |
6. 创建 AOCC 与 AOCL modulefile
6.1 AOCC 编译器模块
sudo mkdir -p /opt/modulefiles/compiler/aoccsudo tee /opt/modulefiles/compiler/aocc/3.2.0 >/dev/null <<'EOF'#%Module1.0proc ModulesHelp { } {puts stderr "AMD AOCC 3.2.0 compiler"}module-whatis "AMD AOCC 3.2.0 compiler"# 按 readlink -f $(which clang) 的结果修改set root /opt/software/aocc-compiler-3.2.0setenv AOCC_ROOT $rootprepend-path PATH $root/binprepend-path LD_LIBRARY_PATH $root/libprepend-path LIBRARY_PATH $root/libsetenv CC clangsetenv CXX clang++setenv FC flangsetenv F77 flangEOF |
6.2 AOCL 数学库模块
sudo mkdir -p /opt/modulefiles/math/aoclsudo tee /opt/modulefiles/math/aocl/3.2.0-aocc >/dev/null <<'EOF'#%Module1.0proc ModulesHelp { } {puts stderr "AMD AOCL 3.2.0 libraries for AOCC"}module-whatis "AMD AOCL 3.2.0 for AOCC"set root /opt/AMD/3.2.0setenv AOCL_ROOT $rootprepend-path LD_LIBRARY_PATH $root/amd-blis/libprepend-path LD_LIBRARY_PATH $root/amd-libflame/libprepend-path LD_LIBRARY_PATH $root/amd-scalapack/libprepend-path LD_LIBRARY_PATH $root/amd-fftw/libprepend-path LIBRARY_PATH $root/amd-blis/libprepend-path LIBRARY_PATH $root/amd-libflame/libprepend-path LIBRARY_PATH $root/amd-scalapack/libprepend-path LIBRARY_PATH $root/amd-fftw/libprepend-path CPATH $root/amd-fftw/includeEOFmodule use /opt/modulefilesmodule purgemodule load compiler/aocc/3.2.0 math/aocl/3.2.0-aoccwhich clangwhich flangecho "$AOCL_ROOT" |
路径必须以当前服务器为准 如果 find 命令得到的 AOCL 目录不同,应同步修改 modulefile。module load 成功不等于路径正确,最终还要用 ls、ldd 和链接测试确认库文件确实存在。 |
7. 使用 AOCC 编译 OpenMPI 4.1.4
OpenMPI 是 AMD 路线中最关键的“分界线”。系统里即使已经有 mpicc、mpif90,也不能直接使用,因为它们很可能属于 GNU 或其他编译器环境。这里将 AOCC 版 OpenMPI 安装到独立目录,不使用 /usr/local。
cd /opt/softwaretar -zxvf openmpi-4.1.4.tar.gzcd openmpi-4.1.4module purgemodule use /opt/modulefilesmodule load compiler/aocc/3.2.0unset CFLAGS CXXFLAGS FFLAGS FCFLAGS LDFLAGS LIBShash -rAOCC_CC=$(readlink -f "$(which clang)")AOCC_CXX=$(readlink -f "$(which clang++)")AOCC_FC=$(readlink -f "$(which flang)")./configure \--prefix=/opt/openmpi/4.1.4-aocc \CC="$AOCC_CC" CXX="$AOCC_CXX" FC="$AOCC_FC" F77="$AOCC_FC" \--enable-mpi-fortran=allmake -j"$(nproc)"sudo mkdir -p /opt/openmpi/4.1.4-aoccsudo chown -R "$USER":"$USER" /opt/openmpi/4.1.4-aoccmake install |
为什么不建议 sudo make install sudo 可能清除当前 AOCC 的 PATH 和 LD_LIBRARY_PATH,导致安装阶段突然出现 clang: command not found。更稳妥的方式是预先创建目标目录并授予安装用户写权限。 |
7.1 创建 OpenMPI modulefile
sudo mkdir -p /opt/modulefiles/mpi/openmpisudo tee /opt/modulefiles/mpi/openmpi/4.1.4-aocc >/dev/null <<'EOF'#%Module1.0proc ModulesHelp { } {puts stderr "OpenMPI 4.1.4 built with AOCC 3.2.0"}module-whatis "OpenMPI 4.1.4 AOCC build"prereq compiler/aocc/3.2.0set root /opt/openmpi/4.1.4-aoccsetenv MPI_HOME $rootprepend-path PATH $root/binprepend-path LD_LIBRARY_PATH $root/libprepend-path LIBRARY_PATH $root/libprepend-path CPATH $root/includeprepend-path MANPATH $root/share/manEOFmodule purgemodule use /opt/modulefilesmodule load compiler/aocc/3.2.0 mpi/openmpi/4.1.4-aoccwhich mpiccwhich mpif90which mpirunmpif90 --showme:commandmpirun --version |
合格标准 mpicc、mpif90、mpirun 应位于 /opt/openmpi/4.1.4-aocc/bin;mpif90 --showme:command 应显示 flang 或 AOCC flang 的完整路径。若显示 gfortran,必须停止并清理环境。 |
8. 创建统一 AMD 编译环境 env/aocc/3.2.0
分层 modulefile 便于排错,但日常编译软件时逐个加载 compiler、math 和 mpi 容易遗漏。可以再创建一个总环境模块,作为 VASP、QE、LAMMPS、CP2K 等软件的统一编译入口。
sudo mkdir -p /opt/modulefiles/env/aoccsudo tee /opt/modulefiles/env/aocc/3.2.0 >/dev/null <<'EOF'#%Module1.0proc ModulesHelp { } {puts stderr "AOCC 3.2.0 + AOCL 3.2.0 + OpenMPI 4.1.4"}module-whatis "Unified AMD HPC build environment"module load compiler/aocc/3.2.0module load math/aocl/3.2.0-aoccmodule load mpi/openmpi/4.1.4-aoccsetenv OMP_NUM_THREADS 1EOFmodule purgemodule use /opt/modulefilesmodule load env/aocc/3.2.0module listwhich clangwhich flangwhich mpif90mpif90 --showme:command |
从这一步开始,后续编译 VASP 只需要先加载 env/aocc/3.2.0。这样既减少人为遗漏,也方便未来把 VASP modulefile 设计成自动加载底层环境。
9. 准备 VASP 5.4.4 源码与 makefile.include
9.1 解压并确认真实源码目录
cd /opt/vasptar -zxvf /opt/software/vasp.5.4.4.tar.gzfind /opt/vasp -maxdepth 4 -type f -name makefile# 进入同时包含 arch、src、makefile 的真实目录cd /opt/vasp/vasp.5.4.4ls arch src makefile |
部分源码包解压后存在两层同名目录。不要根据目录名猜测,必须以是否同时存在 arch、src 和顶层 makefile 为判断标准。
9.2 推荐 makefile.include
# ============================================================# VASP 5.4.4 - Ubuntu 22.04# AOCC 3.2.0 + AOCL 3.2.0 + OpenMPI 4.1.4# ============================================================CPP_OPTIONS = -DHOST=\"LinuxAOCC\" \-DMPI -DMPI_BLOCK=8000 -Duse_collective \-DscaLAPACK -DCACHE_SIZE=4000 \-Davoidalloc -Dtbdyn -Dfock_dblbuf -DLAPACK36CPP = clang -E -C -w $*$(FUFFIX) >$*$(SUFFIX) $(CPP_OPTIONS)FC = mpif90FCL = mpif90FREE = -MfreeFFLAGS = -w -Mfree -MbackslashOFLAG = -O2OFLAG_IN = $(OFLAG)DEBUG = -O0# 仅在同型号或兼容 AMD CPU 节点运行时保留VASP_TARGET_CPU ?= -march=nativeFFLAGS += $(VASP_TARGET_CPU)CPP_LIB = $(CPP)FC_LIB = $(FC)CC_LIB = clangCFLAGS_LIB = -O2FFLAGS_LIB = -O1FREE_LIB = $(FREE)OBJECTS_LIB = linpack_double.o getshmem.oCXX_PARS = clang++LIBS += parserLLIBS += -Lparser -lparser -lstdc++AMDBLIS_LIB = /opt/AMD/3.2.0/amd-blis/libAMDLIBFLAME_LIB = /opt/AMD/3.2.0/amd-libflame/libAMDSCALAPACK_LIB = /opt/AMD/3.2.0/amd-scalapack/libAMDFFTW_LIB = /opt/AMD/3.2.0/amd-fftw/libAMDFFTW_INC = /opt/AMD/3.2.0/amd-fftw/includeINCS += -I$(AMDFFTW_INC)BLAS = -L$(AMDBLIS_LIB) -lblisLAPACK = -L$(AMDLIBFLAME_LIB) -lflameSCALAPACK = -L$(AMDSCALAPACK_LIB) -lscalapackLLIBS += $(SCALAPACK) $(LAPACK) $(BLAS)LLIBS += -L$(AMDFFTW_LIB) -lfftw3LLIBS += -lm -ldl -lpthreadOBJECTS = fftmpiw.o fftmpi_map.o fftw3d.o fft3dlib.oOBJECTS_O1 += fftw3d.o fftmpiw.o fftmpi.oOBJECTS_O2 += fft3dlib.o |
两点必须根据实际环境调整 第一,AOCL 的五个路径以 find 结果为准;第二,-march=native 只适合编译节点与计算节点 CPU 指令集兼容的场景。异构集群应删除该选项或改用更保守的目标架构。 |
AOCL FFTW 通常只需链接 -lfftw3。如果链接阶段明确出现 fftw_mpi_* 未定义,再检查当前 AOCL 是否提供 MPI FFTW 接口,并按实际库增加 -lfftw3_mpi;不要在没有报错依据时随意混入 Ubuntu 系统 FFTW。
10. 编译 vasp_std、vasp_gam 与 vasp_ncl
module purgemodule use /opt/modulefilesmodule load env/aocc/3.2.0cd /opt/vasp/vasp.5.4.4unset MAKEFLAGSmake veryclean 2>/dev/null || truerm -rf build/std build/gam build/ncl build/lib build/parserrm -f bin/vasp_std bin/vasp_gam bin/vasp_nclmake std -j1 2>&1 | tee build_std_aocc.logmake gam -j1 2>&1 | tee build_gam_aocc.logmake ncl -j1 2>&1 | tee build_ncl_aocc.logls -lh bin/vasp_std bin/vasp_gam bin/vasp_ncl |
VASP 5.4.4 的 Fortran module 依赖顺序较敏感。第一次编译建议使用 -j1,先确保配置正确;在特定环境中直接 make -j$(nproc) 可能导致 base.mod、mpimy.mod 等文件尚未生成就被其他源文件引用。
可执行文件 | 主要用途 | 典型调用 |
vasp_std | 常规结构优化、自洽、能带、DOS、分子动力学等 | mpirun -np 16 vasp_std |
vasp_gam | 大超胞且仅使用 Gamma 点 | mpirun -np 16 vasp_gam |
vasp_ncl | SOC、非共线磁性等 | mpirun -np 16 vasp_ncl |
11. 创建 VASP modulefile 并完成运行验收
sudo mkdir -p /opt/modulefiles/vaspsudo tee /opt/modulefiles/vasp/5.4.4-aocc >/dev/null <<'EOF'#%Module1.0proc ModulesHelp { } {puts stderr "VASP 5.4.4 built with AOCC/AOCL/OpenMPI"}module-whatis "VASP 5.4.4 AOCC build"conflict vaspif { [module-info mode load] } {module load env/aocc/3.2.0}set root /opt/vasp/vasp.5.4.4setenv VASP_HOME $rootsetenv VASP_PP_PATH /opt/vaspsetenv PMG_VASP_PSP_DIR /opt/vaspsetenv OMP_NUM_THREADS 1setenv OMP_STACKSIZE 512mprepend-path PATH $root/binEOFmodule purgemodule use /opt/modulefilesmodule load vasp/5.4.4-aoccwhich vasp_stdwhich vasp_gamwhich vasp_nclwhich mpirunmpif90 --showme:commandldd "$(which vasp_std)" | grep "not found" || echo "runtime libraries OK" |
ulimit -s unlimited 不适合依赖 modulefile 执行,建议写入用户的 shell 初始化文件或作业脚本。运行 VASP 时仍建议显式写 mpirun 或 srun,不使用隐藏进程数的 alias。
12. 配置赝势库与 Si 最小测试
12.1 赝势库
VASP 不会自动从赝势目录读取 POTCAR。VASP_PP_PATH 只是为脚本或工具提供统一根路径,每个计算目录仍需按 POSCAR 的元素顺序拼接 POTCAR。
# 单元素 Sicat /opt/vasp/potpaw_PBE/Si/POTCAR > POTCAR# 例如 SrTiO3,POSCAR 元素顺序为 Sr Ti Ocat /opt/vasp/potpaw_PBE/Sr_sv/POTCAR \/opt/vasp/potpaw_PBE/Ti_pv/POTCAR \/opt/vasp/potpaw_PBE/O/POTCAR > POTCARgrep TITEL POTCAR |
12.2 Si 最小测试
mkdir -p ~/vasp_test/Si-aocccd ~/vasp_test/Si-aocccat > INCAR <<'EOF'SYSTEM = Si testENCUT = 300EDIFF = 1E-5ISMEAR = 0SIGMA = 0.05IBRION = -1NSW = 0EOFcat > POSCAR <<'EOF'Si5.430.0 0.5 0.50.5 0.0 0.50.5 0.5 0.0Si2Direct0.00 0.00 0.000.25 0.25 0.25EOFcat > KPOINTS <<'EOF'Automatic mesh0Gamma4 4 40 0 0EOFcat /opt/vasp/potpaw_PBE/Si/POTCAR > POTCARmodule purgemodule use /opt/modulefilesmodule load vasp/5.4.4-aocculimit -s unlimitedmpirun -np 4 vasp_std > vasp.outtail -n 40 vasp.outgrep "Voluntary context switches" OUTCAR |
为什么不能只检查 which vasp_std 可执行文件存在只能证明编译产物被复制到了 PATH。完整验收至少还应包括 ldd 无 not found、MPI 多进程启动、读取完整输入文件、生成 OUTCAR/OSZICAR,并正常结束。 |
13. 可选扩展:VASP 5.4.4 + VTST
VTST code 是参与 VASP 重新编译的 Fortran 源码补丁;vtstscripts 是 NEB 路径生成、能量提取和结果分析脚本。二者作用不同。为了避免破坏已经验证成功的原版 VASP,应复制一份源码后再打补丁。
13.1 准备独立源码目录
sudo mkdir -p /opt/vtstsudo tar -xzf /opt/software/vtstcode-179.tgz -C /opt/vtstsudo tar -xzf /opt/software/vtstscripts.tgz -C /opt/vtst 2>/dev/null || truesudo chmod +x /opt/vtst/vtstscripts/* 2>/dev/null || truecd /opt/vaspcp -a vasp.5.4.4 vasp.5.4.4-vtstcd vasp.5.4.4-vtstmake veryclean 2>/dev/null || truerm -rf build/std build/gam build/ncl build/lib build/parserrm -f bin/vasp_std bin/vasp_gam bin/vasp_ncl bin/vasp_VTSTcp -n src/main.F src/main.F.originalcp -n src/.objects src/.objects.originalcp /opt/vtst/vtstcode-179/* src/ |
13.2 修改 main.F 与 .objects
# src/main.F 中将CALL CHAIN_FORCE(T_INFO%NIONS,DYN%POSION,TOTEN,TIFOR, &LATT_CUR%A,LATT_CUR%B,IO%IU6)# 改为CALL CHAIN_FORCE(T_INFO%NIONS,DYN%POSION,TOTEN,TIFOR, &TSIF,LATT_CUR%A,LATT_CUR%B,IO%IU6)# src/.objects 中,在 chain.o 之前加入bfgs.o dynmat.o instanton.o lbfgs.o sd.o cg.o dimer.o bbm.o \fire.o lanczos.o neb.o qm.o opt.o \ |
13.3 编译并命名 vasp_VTST
module purgemodule use /opt/modulefilesmodule load env/aocc/3.2.0cd /opt/vasp/vasp.5.4.4-vtst# 继续使用已经验证成功的 AMD makefile.includemake std -j1 2>&1 | tee build_vtst_std_aocc.logcp bin/vasp_std bin/vasp_VTSTchmod 755 bin/vasp_VTSTwhich nebmake.pl 2>/dev/null || trueldd bin/vasp_VTST | grep "not found" || echo "VTST runtime libraries OK" |
不要把 VTST 当成独立软件 vasp_VTST 只是对完成 VTST patch 的 vasp_std 进行明确命名,便于与原版区分。没有复制源码、修改 main.F/.objects 并重新编译,仅复制可执行文件名称不会增加任何 VTST 功能。 |
13.4 VTST 版 modulefile
sudo tee /opt/modulefiles/vasp/5.4.4-vtst-aocc >/dev/null <<'EOF'#%Module1.0proc ModulesHelp { } {puts stderr "VASP 5.4.4 + VTST built with AOCC/AOCL/OpenMPI"}module-whatis "VASP 5.4.4 + VTST AOCC build"conflict vaspif { [module-info mode load] } {module load env/aocc/3.2.0}set root /opt/vasp/vasp.5.4.4-vtstset scripts /opt/vtst/vtstscriptssetenv VASP_HOME $rootsetenv VTST_SCRIPTS $scriptssetenv VASP_PP_PATH /opt/vaspsetenv OMP_NUM_THREADS 1prepend-path PATH $root/binprepend-path PATH $scriptsEOFmodule purgemodule use /opt/modulefilesmodule load vasp/5.4.4-vtst-aoccwhich vasp_VTSTwhich nebmake.plmpif90 --showme:command |
14. Slurm 作业脚本示例
在 Slurm 集群中,srun 与 mpirun 二选一,优先采用当前集群已经验证过的启动方式。不要在同一条运行命令中同时嵌套 srun 和 mpirun。
#!/bin/bash#SBATCH -J vasp-aocc-test#SBATCH -N 1#SBATCH --ntasks-per-node=32#SBATCH -p compute#SBATCH -o vasp.out#SBATCH -e vasp.errsource /etc/profile.d/modules.sh 2>/dev/null || truemodule purgemodule use /opt/modulefilesmodule load vasp/5.4.4-aoccexport OMP_NUM_THREADS=1ulimit -s unlimitedsrun vasp_std |
VTST 计算只需将加载模块改为 vasp/5.4.4-vtst-aocc,并将最终命令改为 srun vasp_VTST。多节点运行前还应确认 OpenMPI 与 Slurm 的集成方式、网络互联和节点间共享路径。
15. 高频报错与排查顺序
报错或现象 | 常见原因 | 优先检查 |
checking if Fortran compiler works... no | flang 本身不可用,或环境变量混入旧参数 | 先独立编译 test.f90,再查 config.log |
gfortran: unrecognized option '-Mfree' | 实际使用 GNU Fortran,却加载了 AOCC 参数 | 清理环境,确认 mpif90 后端为 flang |
C and C++ are link compatible... no | clang 与系统 g++ 混用 | 同时使用 clang/clang++,清理 PATH |
make install: clang not found | sudo 清理了 AOCC 环境 | 避免 sudo make install,或显式传递环境 |
mpif90 后端显示 gfortran | 加载了错误的 OpenMPI | module purge 后只加载 AOCC MPI |
cannot find -lblis/-lflame/-lscalapack | AOCL 路径照抄错误 | 使用 find 查询真实库目录 |
getshmem_C 等未定义 | 内部库缺少 getshmem.o | 检查 OBJECTS_LIB 并清理重编 |
parse_file_C 等未定义 | parser 未编译或未链接 | 检查 CXX_PARS、LIBS、LLIBS |
undefined reference to dgegv_ | LAPACK 接口兼容问题 | 启用 -DLAPACK36,必要时修改 symbol.inc |
Cannot open module file *.mod | 并行 make 破坏 Fortran 编译顺序 | 删除 build 后 make std -j1 |
15.1 OpenMPI configure 失败时
module purgemodule use /opt/modulefilesmodule load compiler/aocc/3.2.0unset FC F77 FFLAGS FCFLAGS CFLAGS CXXFLAGS LDFLAGS LIBShash -rwhich clangwhich clang++which flangflang /tmp/test_aocc.f90 -o /tmp/test_aocc && /tmp/test_aoccgrep -n -B 50 -A 80 "checking if Fortran compiler works" config.log |
15.2 确认 MPI 没有串线
module purgemodule use /opt/modulefilesmodule load env/aocc/3.2.0which mpif90mpif90 --showme:commandmpif90 --showme# 结果必须指向 AOCC flang,而不是 gfortran |
15.3 库链接错误时不要先重装全部环境
先确认报错的库名,再用 find 定位文件;检查 makefile.include 中 -L 路径与 modulefile 的 LD_LIBRARY_PATH 是否一致。只有库确实不存在时才考虑重新安装 AOCL。大量“cannot find”问题本质上只是路径写成了不存在的统一 lib 目录。
16. 一键安装脚本应具备哪些能力
真正可靠的一键脚本,不应只是把文档命令依次粘贴到一个 shell 文件中。AMD 路线的路径差异和环境污染较多,脚本必须具备探测、判断、记录和回滚能力。
能力 | 应完成的工作 | 专业价值 |
安装包预检 | 检查 AOCC、AOCL、OpenMPI、VASP、VTST 文件是否存在 | 避免运行到中途才发现缺包 |
编译器探测 | 记录 clang、clang++、flang 的真实路径与版本 | 防止系统 LLVM 或 GNU 工具链混入 |
AOCL 路径识别 | 自动定位 BLIS、libFLAME、ScaLAPACK、FFTW | 适配不同 AOCL 安装目录 |
MPI 后端验证 | 检查 mpif90 --showme:command 是否为 flang | 阻止错误 MPI 继续编译 VASP |
配置生成 | 基于真实路径生成 makefile.include 与 modulefile | 避免手工照抄路径 |
日志与失败退出 | 保存 configure/make 日志,任一步失败立即停止 | 便于定位和复现 |
分版本隔离 | 原版与 VTST 版使用独立源码、bin 和 modulefile | 防止补丁覆盖原版 |
三级验收 | 检查 which、ldd、MPI 启动和最小算例 | 证明程序不仅“编译出来”,而且可以运行 |
我们的一键安装与远程服务 云算科技可根据服务器 CPU、操作系统、现有 MPI/编译器环境和集群调度方式,使用脚本完成自动化部署,并保留关键配置、编译日志、modulefile 与验收结果。服务不包含未授权 VASP 源码或赝势的提供。 |
17. 最终验收清单
检查对象 | 验收命令或要求 | 合格结果 |
AOCC | which clang; which flang | 均来自 AOCC 安装目录 |
OpenMPI | which mpif90; mpif90 --showme:command | 位于 4.1.4-aocc,后端为 flang |
AOCL | find/ls 检查四类数学库 | BLIS、libFLAME、ScaLAPACK、FFTW 均存在 |
原版 VASP | which vasp_std/gam/ncl | 三者来自原版 VASP bin |
运行库 | ldd $(which vasp_std) | 没有 not found |
MPI 运行 | mpirun -np 4 vasp_std | 能够启动多进程并读取输入 |
测试算例 | OUTCAR/OSZICAR/vasprun.xml | 正常生成并结束 |
VTST 可选 | which vasp_VTST; which nebmake.pl | 可执行文件与脚本来自独立 VTST 环境 |
环境切换 | module purge 后重新加载 | 不依赖杂乱的永久 PATH |
交付时建议保留 成功使用的 makefile.include、modulefile、编译日志、版本信息、最小测试输入与输出摘要。它们既是验收依据,也是后续升级、迁移和故障恢复的重要资料。 |
结语
AMD 编译路线的难点,不在于命令数量,而在于“每一层都必须能证明自己来自正确的环境”。AOCC、AOCL 和 OpenMPI 只要有一层串线,错误就可能延迟到 VASP 链接甚至运行阶段才暴露。因此,安装过程中最有价值的习惯不是反复 make,而是先确认编译器,再确认 MPI wrapper,再确认数学库路径,最后通过 ldd 与最小算例完成闭环。
读者可以根据本文逐步完成 Ubuntu 22.04 下的 VASP 5.4.4 AMD 环境部署。对于已有多套编译器、多个 MPI、Slurm 集群、多节点共享文件系统,或需要同时部署原版与 VTST 版的服务器,建议采用脚本化和模块化方式交付。这样不仅安装成功,也能让后续用户清楚地加载、运行、排错和维护。
云算科技可提供 VASP、Quantum ESPRESSO、Yambo、EPW、ABINIT、CP2K、LAMMPS、GROMACS 等科研软件的远程安装与环境配置服务,并可结合 GNU、Intel、AMD 编译环境、Slurm 调度和多版本 modulefile 进行统一规划。

夜雨聆风