WSL2编译Quantum Espresso(QE)GPU版本

一、前言

        前面已经讲了QE的Intel版本编译,本文将对其GPU版本编译进行展开,适用于全新的WSL2安装,值得一提的是如果是小型计算任务,用Intel编译的更快,首先是因为其内存大而且CPU线程数多,而GPU显存有效,指定线程数没CPU多,虽然现在的QE版本支持CPU和GPU同时跑,但是需要频繁在CPU和GPU之间传递信息,因此速度会变慢,因此GPU更适合大型运算任务,比如超过40个原子的vc-relax。

二、NVIDIA显卡驱动及其CUDA工具包安装

        下载之前,需要安装相关依赖(考虑更换国内镜像源),执行下列指令:

sudo apt-get install gcc g++  build-essential git -y

        WSL2本身已经自带显卡驱动,因此如果你Windows已经装好显卡驱动,就可以跳过本步。英伟达显卡驱动可以在这安装。
NVIDIA GeForce 驱动程序 - N 卡驱动 | NVIDIAicon-default.png?t=N7T8https://www.nvidia.cn/geforce/drivers/        进入网站后,记得操作系统选择Windows(根据个人选择10还是11),下载类型选择Game Ready 驱动程序就行。如图所示:

        下载好显卡驱动后,需要下载CUDA Toolkits,本次教程选cuda_12.3.0_545.23.06_linux.run,需要注意的是,在选用时记得选择WSL版本而且必须与HPC版本对应,下载地址为:https://developer.nvidia.com/cuda-downloads,如图所示。

        在安装之前,需要设置安装模式设置为命令行模式,如果你是图形界面模式的话,否则无法输入后面所需的accept,首先查看系统默认安装模式:

systemctl get-default

         如果为graphical.target,这需要更改为命令行模式,执行下列指令:

systemctl set-default multi-user.target

        设置好安装模式后,下载CUDA Toolkit,按下图选择即可。 

        之后按照安装指导复制指令即可,首先下载runfile文件:

wget https://developer.download.nvidia.com/compute/cuda/12.3.0/local_installers/cuda_12.3.0_545.23.06_linux.run

         然后执行下列指令安装CUDA toolkit:

sudo sh cuda_12.3.0_545.23.06_linux.run

        等待两三分钟后,输入“accept”继续,并选择“install”开始安装 。

        安装好CUDA-toolkit后,配置环境变量,命令如下(根据实际情况更改版本号12.3):

echo -e '\nexport CUDA_HOME=/usr/local/cuda-12.3\nexport PATH=$PATH:$CUDA_HOME/bin\nexport LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$CUDA_HOME/lib64\n'  >>  ~/.bashrc

         之后重新加载bashrc,指令如下:

source ~/.bashrc

         配置好环境变量后,可以输入nvcc --version,如果输入版本说明安装成功。如果你不放心,可以下载cuda-samples测试(建议没必要进行后续操作,除非你电脑根本没有显卡,否则大概率会通过),其github地址如下:

NVIDIA/cuda-samples: Samples for CUDA Developers which demonstrates features in CUDA Toolkit (github.com)icon-default.png?t=N7T8https://github.com/NVIDIA/cuda-samples        输入下列指令克隆源代码(这里推荐一个软件dev-sidecar,它支持github加速和git代理,如果你安装好Windows版本后,按照软件提示安装好安全证书,打开系统代理,输入git clone https://githubfast.com/NVIDIA/cuda-samples.git):

git clone https://github.com/NVIDIA/cuda-samples.git

        克隆完成后,使用cd cuda-samples进入文件夹内,使用下列make -j8(8是CPU线程数)指令编译,之后执行下列指令测试:

cd bin/x86_64/linux/release
./deviceQuery

         如果显示pass这说明安装成功。

三、NVIDIA HPC安装

        下载好CUDA-toolkit后,需要安装HPC,其下载地址如下:

NVIDIA HPC SDK Releases | NVIDIA Developericon-default.png?t=N7T8https://developer.nvidia.com/nvidia-hpc-sdk-releases        根据个人需求下载,不过最好和CUDA-toolkit版本对应,本次教程下载目前最新版本nvhpc_2024_243_Linux_x86_64_cuda_12.3.tar.gz,如图所示:

        然后按照安装教程下载即可,首先下载安装压缩包,指令如下:

wget https://developer.download.nvidia.com/hpc-sdk/24.3/nvhpc_2024_243_Linux_x86_64_cuda_12.3.tar.gz

        之后解压压缩包,执行下列指令:

tar xpzf nvhpc_2024_243_Linux_x86_64_cuda_12.3.tar.gz

         解压完成后,执行安装程序(可以用tab补全):

nvhpc_2024_243_Linux_x86_64_cuda_12.3/install

        按回车确认安装位置,默认为/opt/nvidia/hpc_sdk,之后按“1”选择单机安装,可能步骤不一样,但是按照提示安装即可。 

        之后配置环境变量,指令如下(根据实际情况更换版本号,即本文的24.3):

echo -e '\n\nexport NVARCH=`uname -s`_`uname -m`\nexport NVCOMPILERS=/opt/nvidia/hpc_sdk\nexport MANPATH=$MANPATH:$NVCOMPILERS/$NVARCH/24.3/compilers/man\nexport PATH=$NVCOMPILERS/$NVARCH/24.3/compilers/bin:$PATH\n'
>>  ~/.bashrc

        使用source ~/.bashrc重新加载bashrc,然后输入pgcc --version,如果显示版本说明安装成功。 

四、QE的GPU版本编译

        在配置好上述步骤后,可以输入 nvidia-smi显示GPU的所有基础信息,如果正常显示说明环境配置完成了。

        接下来,就是QE的GPU版本编译,本文选用QE 7.3版本编译,首先下载压缩包,指令如下:

wget https://gitlab.com/QEF/q-e/-/archive/qe-7.3/q-e-qe-7.3.tar.gz

        解压压缩包,执行下列指令:

tar xvzf q-e-qe-7.3.tar.gz

        进入解压文件夹内, 执行下列指令:

cd q-e-develop

        首先导入CUDA_HOME,执行下列指令:

export CUDADIR=/usr/local/cuda-12.3

        注意这里是CUDA-Toolkit的安装路径,而不是CUDA HPC安装自带的CUDA-toolkit,不知道为什么如果不用CUDA-toolkit,后面会报错误。

        GPU编译的模块如下,需要根据自己安装CUDA和显卡计算架构更改:

 ./configure --with-cuda=$CUDADIR --with-cuda-runtime=YY --with-cuda-cc=ZZ --enable-openmp --with-scalapack=no LIBS="-L$CUDADIR/../math_libs/lib64 -L$CUDADIR/lib64/stubs/"

        YY是你安装的CUDA-toolkit的版本,而ZZ是你显卡的架构。 

        查看显卡的计算架构和CUDA版本(WSL2安装的版本,不是Windows的),执行下列指令:

 nvaccelinfo | grep -e 'Target' -e 'Driver'

         比如如果显示如下,则编译指令为:

CUDA Driver Version: 11000

Default Target: cc70 

 ./configure --with-cuda=$CUDADIR --with-cuda-runtime=11.0 --with-cuda-cc=70 --enable-openmp --with-scalapack=no LIBS="-L$CUDADIR/../math_libs/lib64 -L$CUDADIR/lib64/stubs/"

         然而如果nvaccelinfo不显示任何消息,说明可能WSL2没有检测到显卡,你可以重新开一个终端或者重启电脑试试,推荐到下列网站查看你显卡对应的计算架构(为什么说是显卡的计算架构,你可以看一下Makefile里对应的位置,如图所示,可以看到本文使用的架构为86,而其他的则不尽相同,而且这里一定要对应上,否则会报error in Message Passing (mp) module;error code:  9035;configure: error: Fortran could not compile .f90 files之类的错误):

# GPU architecture (Kepler: 35, Pascal: 60, Volta: 70 )
GPU_ARCH=86

        查看显卡计算架构的链接如下,根据你的显卡类型选择对应的查看,比如本文是GeForce RTX 3060 Ti,这架构如图所示:CUDA GPUs - Compute Capability | NVIDIA Developericon-default.png?t=N7T8https://developer.nvidia.com/cuda-gpus          这里是8.6,也就是Makefile的86。

        QE其实自带了显卡检测的py文件,如果你未找到相关信息,可以执行下列指令查看:

cd dev-tools
python3 get_device_props.py 

         之后会显示编译时对应的YY和ZZ,然而不知道为什么有时候显示找不到libcuda.so相关的错误,所有我前面并未提该种方法。如果你也是这个错误,你需要去上述网站在仔细找找。

        如果到这里一切顺利,比如本文对应的Cuda-toolkit是12.3,架构为86,则执行下列指令编译:

 ./configure --with-cuda=$CUDADIR --with-cuda-runtime=12.3 --with-cuda-cc=86 --enable-openmp --with-scalapack=no LIBS="-L$CUDADIR/../math_libs/lib64 -L$CUDADIR/lib64/stubs/"

        配置成功后,使用make pw编译 ,如果你指定了--prefix参数,还要输入指令make pw install,才可以把二进制文件复制到指定路径。

        执行下列指令配置环境变量:

echo "export PATH=`pwd`/bin:$PATH" >> ~/.bashrc && source ~/.bashrc

五、常见问题解决

5.1 配置报错类型

(1)Fortran compiler accepts -Mcuda=cuda12.3,are you using nvfortran

        安装cuda版本和你--with-cuda-runtime对应不上,运行nvcc --version,查看cuda-toolkit版本,更改--with-cuda-runtime的值

(2)configure: error: Compiler version too old, use at least 21.7

        nvfortran版本太老,考虑更新HPC版本大于21.7。

5.2 编译报错类型

(1)fox_init_module.f90(6): error 

        由于github无法连接,fox没有克隆下来,需要科学上网。或者按照如下github源码编译好fox,找到Quantum Espresso目录下的external文件夹,将里面的fox文件夹替换为你从GitHub上下载下来并且编译后的fox文件夹。andreww/fox: A Fortran XML library (github.com)icon-default.png?t=N7T8https://github.com/andreww/fox         替换好后,先使用make clean清除,然后在make pw -j8。

(2)undefined reference to `curandDestroyGenerator'等相关

        具体报错详情如下,这是qe6.8的bug,换个qe版本:

/home/anson/qe/qe-6.8/Modules/random_numbers_gpu.f90:67: undefined reference to `curandDestroyGenerator'
/home/anson/qe/qe-6.8/Modules/random_numbers_gpu.f90:68: undefined reference to `curandCreateGenerator'
/home/anson/qe/qe-6.8/Modules/random_numbers_gpu.f90:69: undefined reference to `curandSetPseudoRandomGeneratorSeed'
/home/anson/qe/qe-6.8/Modules/random_numbers_gpu.f90:73: undefined reference to `curandGenerateUniformDouble'

(3)configure: error: Couldn't find libcuda.so

        在编译时使用的是HPC,但不知道为啥自带的cuda有时编译时报错,需要额外安装对应cuda-toolkit,之后按上面所述编译指令编译即可。

5.3 pw.x运行报错

        由于编译的是允许mpi的pw,因此必须使用mpirun pw.x,否则只输入pw.x会没反应。

(1)An error occurred in MPI_Init_thread

         具体报错详情如下:

*** An error occurred in MPI_Init_thread
*** on a NULL communicator
*** MPI_ERRORS_ARE_FATAL (processes in this communicator will now abort,
*** and potentially your MPI job)
Local abort before MPI_INIT completed completed successfully, but am not able to aggregate error messages, and not able to guarantee that all other processes were killed!

          可以由于系统的openmpi缓冲区未知或者缓冲区大小问题,在bashrc添加如下语句,之后source ~/.bashrc。

ulimit -s 65536
export OPAL_PREFIX=/opt/nvidia/hpc_sdk/Linux_x86_64/2024/comm_libs/openmpi4

(2) ALLOCATE: copyin Symbol Memcpy FAILED:13(invalid device symbol)

        Cuda版本太老了和你显卡无法适配,更新Cuda版本

六、测试

        最后在说一个警告/sbin/ldconfig.real: /usr/lib/wsl/lib/libcuda.so.1 is not a symbolic link,不用管,无伤大雅。

        下载测试包:https://pan.baidu.com/s/1tZe4t1Zd7usHesw1i05tYg?pwd=wkjy

        解压:unzip diamond.zip

       进入解压文件夹内:cd diamond

        运行下列指令测试:

mpirun -n 4 pw.x < pwscf.in > pwscf.out

         查看pwscf.out文件,如果最后看到job done,在开头时看到GPU activation说明GPU版本安装成功了。 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值