安装VASP之前需要具备三个条件:编译器、数据库和并行计算程序(参见官网:Installing VASP.6.X.X - VASP Wiki),本人选择如下图所示。因此只需要安装intel-oneapi-mkl和NVIDIA HPC-SDK。
一、安装intel-oneapi-mkl
选择online installer或offline installer,通过wget命令下载,然后安装,安装界面自动打开,勾选协议,点击customise自定义,只勾选Math Kernel Library (MKL)
wget https://registrationcenter-download.intel.com/akdlm/IRC_NAS/9a98af19-1c68-46ce-9fdd-e249240c7c42/l_BaseKit_p_2024.2.0.634_offline.sh
sh l_BaseKit_p_2024.1.0.596.sh
安装好后,通过如下命令设置激活环境变量:
source ~/intel/oneapi/mkl/2024.2/env/vars.sh
注意:若之前通过intel oneapi安装过CPU版本VASP,则表明已经对MKL库进行了编译(make libintel64)(参见vasp6.3.2安装包及安装步骤_vasp下载-CSDN博客)。此时若直接用编译过的MKL库,后面通过NVIDIA HPC-SDK编译VASP将会报错。由于本人安装GPU版本VASP之前,已经安装过CPU版本VASP,所以已经对MKL库进行了编译,导致编译VASP报错,而且此错误很少出现,网上也没找到相关问题,折腾了很久才发现此问题。
二、安装NVIDIA HPC-SDK
安装NVIDIA之前需具备NVIDIA驱动和CUDA,一般情况下电脑已经安装了NVIDIA驱动,但没有安装CUDA。
首先查看NVIDIA驱动的版本,以及所支持的CUDA版本。
nvidia-smi
如下图所示,本人的NVIDIA驱动版本为535.183.01,CUDA最大支持的版本为12.2。若输入nvidia-smi未得到下图信息,表明驱动未安装,需要安装驱动,下文会讲如何安装驱动。若出现错误提示: nvidia-smi has failed because it couldn't communicate with the NVIDIA driver,表明安装的驱动版本与系统内核版本不一致,需要重新安装驱动或系统内核,使他们的版本匹配。
确定好驱动后,检查CUDA版本。
nvcc -V
如下图所示,本人安装的版本为12.2.140。如果此处得到的版本高于12.2,比如本人之前安装了12.5版本,高于了驱动所支持的版本,将会影响cuda的使用,需要重新安装cuda。
1. 安装NVIDIA驱动
1)禁止nouveau驱动
在安装NVIDIA驱动前需要禁止系统自带显卡驱动nouveau,首先查看nouveau驱动运行情况:
lsmod | grep nouveau
输入命令后,若无任何输出,表明nouveau驱动已被禁止,若有输出,则表明其正在工作,需要手动禁止。
sudo gedit /etc/modprobe.d/blacklist.conf
通过vi或gedit在编辑blacklist.conf文件,其文件末尾加入下面两行:
blacklist nouveau
options nouveau modeset=0
然后,更新应用更改,并重启电脑
sudo update-initramfs -u
sudo reboot
重启后,即可开始安装NVIDIA驱动。
2)安装nvidia-driver
方法一:通过系统自带的“软件和更新”界面安装。
打开软件和更新(Softwares & Updates)-> 附加驱动(Additional Drivers)-> 选择NVIDIA驱动 -> 应用更改 (Apply Changes)。该界面会自动根据电脑上的GPU显示推荐的NVIDIA显卡驱动,安装完成后需要重启电脑。
此方法最简单,但可选择往往不是最新的版本。
方法二:通过apt安装。
此方法安装的本质与方法一相同 ,但对于远程登陆的用户,无法打开“软件和更新”界面,因此可选择此方法进行安装。
首先终端输入:
ubuntu-drivers devices
输出内容与“软件和更新”界面的内容基本一致。找到系统推荐的版本。
然后通过apt安装系统推荐的版本,并重启电脑。
sudo apt install nvidia-driver-535
sudo reboot
方法三:官网下载安装。
上述两种方法安装的驱动版本往往不是最新版本,若想安装新版本,或升级版本,可采用此方法。
此方法安装/更新驱动之前,需要卸载旧的驱动。
sudo apt --purge remove nvidia*
sudo apt purge nvidia*
sudo apt purge libnvidia*
sudo apt autoremove
卸载完后可通过如下命令检查卸载情况
sudo dpkg --list | grep nvidia-*
进入官网( NVIDIA GeForce 驱动程序 - N 卡驱动 | NVIDIA),根据自己显卡版本和系统版本选择合适的驱动,下载获取NVIDIA-Linux-x86_64-xxx.xx.run文件,并通过下列命令进行安装。
sudo sh NVIDIA-Linux-x86_64-xxx.xx.run -no-x-check -no-nouveau-check -no-opengl-files
本方法缺点:通过此方法安装可能会报错,需要一一解决。下载的版本可能与电脑系统所支持的版本不匹配也会安装失败。因此,需要谨慎选择此方法。
2. 安装CUDA
安装CUDA前,安装必要的依赖库文件
sudo apt-get install freeglut3-dev build-essential libx11-dev libxmu-dev libxi-dev libgl1-mesa-glx libglu1-mesa libglu1-mesa-dev
进入官网 https://developer.nvidia.com/cuda-toolkit-archive,选择合适的版本(前面已提到,通过nvidia-smi查看系统所支持的最大版本),本人系统最大支持12.2版本,所以选择下载CUDA Toolkit 12.2.2版本。
选择好版本后,获得下载和安装命令
wget https://developer.download.nvidia.com/compute/cuda/12.2.2/local_installers/cuda_12.2.2_535.104.05_linux.run
sudo sh cuda_12.2.2_535.104.05_linux.run
运行命令后,进入安装界面,选择“continue",然后输入”accept"
然后将“Driver”选项去掉,因为前面已经安装好了驱动。然后选择“Install"开始安装。
安装完成后,在.bashrc中设置环境变量
export PATH=$PATH:/usr/local/cuda/bin export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda/lib64
source ~/.bashrc后,即可通过nvcc -V检查cuda版本信息。
3. 安装HPC-SDK
进入官网(https://developer.nvidia.com/nvidia-hpc-sdk-releases)下载HPC-SDK安装包。根据cuda版本,选择hpc-sdk版本,本人cuda版本为12.2,因此选择了hpc sdk 23.9。
通过命令,下载、解压并安装
wget https://developer.download.nvidia.com/hpc-sdk/23.9/nvhpc_2023_239_Linux_x86_64_cuda_12.2.tar.gz
tar xpzf nvhpc_2023_239_Linux_x86_64_cuda_12.2.tar.gz
nvhpc_2023_239_Linux_x86_64_cuda_12.2/install
进入安装界面,选择“3 Auto install”,然后输入安装目录,本人安装在个人用户目录里,开始安装。
安装完成后,在.bashrc中设置环境变量:
export PATH=/home/wliu/Applications/nvidia/hpc_sdk/Linux_x86_64/23.9/comm_libs/mpi/bin:$PATH
export PATH=/home/wliu/Applications/nvidia/hpc_sdk/Linux_x86_64/23.9/compilers/bin:$PATH
检查安装及变量设置是否正确(mpicc, mpif90, nvfortran为后面编译VASP时要用到的编译器)
三、安装VASP
1. 修改配置文件
由于我们选择使用intel-oneapi-mkl和NVIDIA HPC-SDK进行安装,因此我们选择的编译文件为:makefile.include.nvhpc_ompi_mkl_omp_acc。
1)进入vasp文件夹,将编译文件复制出来。
cp arch/makefile.include.nvhpc_ompi_mkl_omp_acc makefile.include
2)修改编译文件
a. 首先,修改cuda版本,本人的版本为12.2。根据GPU版本修改-gpu后面的参数,本人是RTX4090,更改为cc89,cc90
b. 然后,第60行,由于本人是AMD EPYC 9xx4系列的CPU,所以将-tp host改成了-tp znver4,如果是Intel的CPU,不需要更改。
c. 接下来是HPC-SDK的路径,先在终端内输入
which nvfortran | awk -F /compilers/bin/nvfortran '{ print $$1 }'
查看输出路径是否正确,若正确便不需要更改hpc-sdk路径,若不正确,可以通过68-70行手动设置hpc-sdk路径。
d. 接下来是数据库文件目录(MKLROOT),可通过如下命令查看
echo $MKLROOT
若无输出,表明第一步安装的intel-oneapi-mkl未激活,需要重新激活 source ~/intel/oneapi/mkl/2024.2/env/vars.sh, 激活后,MKLROOT ?= 后面可空着,或者更改为正常的路径,如下图所示。由于我们完全采用MKL提供的数据库,不单独设置scaLAPACK,因此将88、89行注释掉。
完整编译文件如下(已把openmp的相关内容删除,发现去掉后计算速度快点。删除了其他不需要的部分,保留了HDF5部分,后面再试试加上HDF5编译的效果):
export MKLROOT= /home/wliu/intel/oneapi/mkl/2024.1
# Default precompiler options
CPP_OPTIONS = -DHOST=\"LinuxNV\" \
-DMPI -DMPI_INPLACE -DMPI_BLOCK=8000 -Duse_collective \
-DscaLAPACK \
-DCACHE_SIZE=4000 \
-Davoidalloc \
-Dvasp6 \
-Duse_bse_te \
-Dtbdyn \
-Dqd_emulate \
-Dfock_dblbuf \
-D_OPENACC \
-DUSENCCL
CPP = nvfortran -Mpreprocess -Mfree -Mextend -E $(CPP_OPTIONS) $*$(FUFFIX) > $*$(SUFFIX)
# N.B.: you might need to change the cuda-version here
# to one that comes with your NVIDIA-HPC SDK
CC = mpicc -acc -gpu=cc89,cc90,cuda12.2
FC = mpif90 -acc -gpu=cc89,cc90,cuda12.2
FCL = mpif90 -acc -gpu=cc89,cc90,cuda12.2 -c++libs
FREE = -Mfree
FFLAGS = -Mbackslash -Mlarge_arrays
OFLAG = -fast
DEBUG = -Mfree -O0 -traceback
OBJECTS = fftmpiw.o fftmpi_map.o fftw3d.o fft3dlib.o
LLIBS = -cudalib=cublas,cusolver,cufft,nccl -cuda
# Redefine the standard list of O1 and O2 objects
SOURCE_O1 := pade_fit.o minimax_dependence.o
SOURCE_O2 := pead.o
# For what used to be vasp.5.lib
CPP_LIB = $(CPP)
FC_LIB = $(FC)
CC_LIB = $(CC)
CFLAGS_LIB = -O -w
FFLAGS_LIB = -O1 -Mfixed
FREE_LIB = $(FREE)
OBJECTS_LIB = linpack_double.o
# For the parser library
CXX_PARS = nvc++ --no_warnings
# When compiling on the target machine itself , change this to the
# relevant target when cross-compiling for another architecture
VASP_TARGET_CPU ?= -tp znver4
FFLAGS += $(VASP_TARGET_CPU)
# Specify your NV HPC-SDK installation (mandatory)
#... first try to set it automatically
NVROOT =$(shell which nvfortran | awk -F /compilers/bin/nvfortran '{ print $$1 }')
## Improves performance when using NV HPC-SDK >=21.11 and CUDA >11.2
OFLAG_IN = -fast -Mwarperf
SOURCE_IN := nonlr.o
# Software emulation of quadruple precsion (mandatory)
QD ?= $(NVROOT)/compilers/extras/qd
LLIBS += -L$(QD)/lib -lqdmod -lqd
INCS += -I$(QD)/include/qd
# Intel MKL for FFTW, BLAS, LAPACK, and scaLAPACK
MKLROOT ?= /home/wliu/intel/oneapi/mkl/2024.1
LLIBS_MKL = -Mmkl -L$(MKLROOT)/lib/intel64 -lmkl_scalapack_lp64 -lmkl_blacs_openmpi_lp64
INCS += -I$(MKLROOT)/include/fftw
LLIBS += $(LLIBS_MKL)
# HDF5-support (optional but strongly recommended)
#CPP_OPTIONS+= -DVASP_HDF5
#HDF5_ROOT ?= /path/to/your/hdf5/installation
#LLIBS += -L$(HDF5_ROOT)/lib -lhdf5_fortran
#INCS += -I$(HDF5_ROOT)/include
2. 编译VASP
make std
由于我基本上只用到标准版本,因此只编译std,若需要其他版本,使用'make all'进行编译,将在bin文件夹内得到vasp_std, vasp_gam, vasp_ncl三个版本。
3. 设置环境变量
在~/.bashrc中加入下面这行,并进行激活(source ~/.bashrc)
export PATH=$PATH:/home/wliu/DFT/vasp.4.3.2/bin
四、测试
cd进入vasp示例文件夹
mpirun -np 1 vasp_std
-np后的数量为GPU数量。一个GPU就只能为1。