- 目标: 在容器内使用 Environment Modules 管理
nvhpc与后续的 VASP 环境。 - 系统环境: Linux 容器,基于 Ubuntu 24.04(
apt可用)。 - GPU 环境: 2× NVIDIA GeForce RTX 3090(24 GB,Ampere sm_86),驱动
550.54.14,nvidia-smi报告 CUDA12.4,nvcc -V为 CUDA12.6.20。 - NVHPC/HPC-X 版本: NVIDIA HPC SDK
24.9,主要使用 modulenvhpc-hpcx-cuda12/24.9。 - NVHPC 安装路径:
/root/shared-nvme/nvhpc_sdk/ - 约定: 只使用 Environment Modules(Tcl 版
module),不使用 Lmod。
apt-get update
apt-get install -y environment-modules tcl tcl-devVASP 构建需要 BLAS、LAPACK 和 FFTW,这里统一使用系统库(不依赖 MKL):
apt-get install -y libblas-dev liblapack-dev libfftw3-dev-
安装完成后,相关库通常位于
/usr/lib/x86_64-linux-gnu/,头文件在/usr/include。 -
在 VASP 的
makefile.include.nvhpc_acc中:BLAS = -lblas LAPACK = -llapack SCALAPACK = -Mscalapack FFTW_ROOT ?= /usr LLIBS += -L$(FFTW_ROOT)/lib -lfftw3 INCS += -I$(FFTW_ROOT)/include
当前 ~/.bashrc 已统一配置好 Environment Modules 与 NVHPC modulefiles,关键片段为:
source /etc/profile.d/modules.sh
# Add NVHPC SDK modulefiles to default MODULEPATH
module use /root/shared-nvme/nvhpc_sdk/modulefiles只要是通过 bash 启动的交互 shell(包括 ssh 登录后),都会自动:
- 初始化 Environment Modules(
module命令可用); - 把
/root/shared-nvme/nvhpc_sdk/modulefiles加入默认MODULEPATH。
在任意新的 shell 中,只需要:
source ~/.bashrc # ssh 登录后通常会自动执行,这里只是显式写出来
module avail nvhpc # 确认 nvhpc 相关模块已经可见
module avail nvhpc-hpcx* # 查看带 HPC-X 的 module 变体
# 本笔记中实际使用的构建环境
module load nvhpc-hpcx-cuda12/24.9
module list确认:
which nvfortran
which mpif90
which nvcc路径都在 /root/shared-nvme/nvhpc_sdk/Linux_x86_64/24.9/... 下,则说明当前 shell 的 NVHPC/HPC-X 环境加载正确。
- 编译环境:
nvhpc-hpcx-cuda12/24.9(NVHPC 24.9 + HPC-X + CUDA 12),不使用 MKL。 - VASP 源码目录:
/root/shared-nvme/dev260310/vasp.6.4.2
source /etc/profile.d/modules.sh
module use /root/shared-nvme/nvhpc_sdk/modulefiles
module load nvhpc-hpcx-cuda12/24.9
module list
which mpif90cd /root/shared-nvme/dev260310/vasp.6.4.2
cp arch/makefile.include.nvhpc_acc makefile.include- 该配置:
- 使用 NVHPC + OpenACC/CUDA(
-acc -gpu=... -cudalib=cublas,cusolver,cufft,nccl); - 使用通用 BLAS/LAPACK(
-lblas -llapack)+ ScaLAPACK(-Mscalapack),不依赖 MKL。
- 使用 NVHPC + OpenACC/CUDA(
推荐根据 RTX 3090 + CUDA 12 调整 GPU 架构行(示例):
FC = mpif90 -acc -gpu=cc86,cuda12.0
FCL = mpif90 -acc -gpu=cc86,cuda12.0 -c++libsmakefile.include.nvhpc_acc 中相关部分(简要):
BLAS = -lblas
LAPACK = -llapack
SCALAPACK = -Mscalapack
FFTW_ROOT ?= /path/to/your/fftw/installation
LLIBS += -L$(FFTW_ROOT)/lib -lfftw3
INCS += -I$(FFTW_ROOT)/include-
若使用系统库,可通过
apt安装:apt-get install -y libblas-dev liblapack-dev libfftw3-dev
然后将
FFTW_ROOT改为/usr即可:FFTW_ROOT ?= /usr -
若改为使用 NVHPC 自带 math_libs,可后续按实际安装路径调整
BLAS/LAPACK/FFTW_ROOT。
cd /root/shared-nvme/dev260310/vasp.6.4.2
make std -j1 # 仅编译 vasp_std
# 或:make all -j$(nproc) # vasp_std / vasp_gam / vasp_ncl 全部
ls bin
file bin/vasp_std若编译失败,查看并保存最后一段 make 输出(或 build_log.txt),按错误信息调整 makefile.include 中的库路径配置。
- 模块文件路径:
/root/shared-nvme/modulefiles/vasp/6.4.2 - 主要内容(Environment Modules Tcl 格式):
#%Module1.0
proc ModulesHelp { } {
puts stderr "VASP 6.4.2 (std, GPU, built with nvhpc-hpcx-cuda12/24.9)"
puts stderr "Installed by wangzk@paratera.com"
puts stderr "Installed at 2026-3-10 17:45:35"
}
module-whatis "VASP 6.4.2 (std, GPU, NVHPC 24.9 + HPC-X + CUDA 12.x)"
# 依赖的编译环境
module load nvhpc-hpcx-cuda12/24.9
# VASP 安装根目录
set root /root/shared-nvme/dev260310/vasp.6.4.2
setenv VASP_ROOT $root
# 允许 root 运行 HPC-X 的 mpirun
setenv OMPI_ALLOW_RUN_AS_ROOT 1
setenv OMPI_ALLOW_RUN_AS_ROOT_CONFIRM 1
# 默认 OpenMP 线程数(两卡纯 MPI + GPU)
setenv OMP_NUM_THREADS 1
# 将 vasp_std 加入 PATH
prepend-path PATH $root/bin使用方式:
source ~/.bashrc
module load vasp/6.4.2
module list
which vasp_std确认 vasp_std 指向 /root/shared-nvme/dev260310/vasp.6.4.2/bin/vasp_std。
-
测试目录:
/root/shared-nvme/dev260310/vasp_test/o2 -
POSCAR 修正记录:
-
初始
POSCAR来自CONTCAR,且为 Windows 风格行尾(\r\n),导致 VASP 报错:ERROR: there must be 1 or 3 items on line 2 of POSCAR
-
最终改为简单气相 O₂ 分子、并统一为 Unix 行尾(
\n),内容为:O2 molecule 1.0 10.0 0.0 0.0 0.0 10.0 0.0 0.0 0.0 10.0 O 2 Cartesian 0.0 0.0 0.0 1.2 0.0 0.0
-
-
运行环境与命令(在 ssh 登录的干净 shell 中):
cd /root/shared-nvme/dev260310 # 加载模块(会自动设置 NVHPC/HPC-X、允许 root、OMP=1) source ~/.bashrc module load vasp/6.4.2 cd vasp_test/o2 mpirun -np 2 vasp_std > ../../test.log 2>&1
-
预期现象:
test.log中出现:POSCAR, INCAR and KPOINTS ok, starting setupreached required accuracy - stopping structural energy minimisation
- O₂ 自旋极化,
mag ≈ 2.0,总能量约F ~ -9.86E+01 eV(以当时计算为准)。
-
现象示例(
make std报错):NVFORTRAN-F-0004-Unable to open MODULE file incar_reader.mod (reader_base.F: 13) NVFORTRAN-F-0004-Unable to open MODULE file reader_tags.mod (openmp.F: 57) NVFORTRAN-F-0004-Unable to open MODULE file openmp.mod (mpi.F: 3991) -
原因:VASP 目前仍然使用“传统 make 驱动”的 Fortran 构建系统,模块依赖并行度控制比较原始,
make -j$(nproc)容易因为.mod文件尚未生成就被其他目标依赖而失败。 -
解决步骤(建议保守方式):
cd /root/shared-nvme/dev260310/vasp.6.4.2 # 清空上一轮 std 构建 rm -rf build/std # 使用单线程重新构建(避免模块依赖竞态) make std -j1
-
若单线程编译成功,再按需尝试小并行度(如
-j2或-j4),但在 GPU + OpenACC + NVFORTRAN 组合下,推荐长期保持-j1,把并行度交给 MPI + GPU。
备注:VASP 官方当前仍主要依赖手工维护的
makefile与makefile.include.*,尚未提供现代 CMake 风格的一键多平台构建链,这类 Fortran 模块顺序问题较常见。
在极端情况下,如果 Cursor 后端进程出现异常(例如环境被写乱、无法正常连接等),可以通过下面命令在容器内强制杀掉所有名为 cursor 的进程,让其由上层重新拉起:
ps -aux | grep cursor | awk '{print $2}' | xargs kill注意:这条命令会杀掉所有名字里包含
cursor的进程,使用前确认当前只在这个容器里开发,避免误杀无关进程。