NVIDIA GeForce RTX 4060 Tiを載せたPCでQuantum ESPRESSO (version 7.2)をGPU用にコンパイルしました。
2024.6.4 CPUとGPUの計算速度の比較を追記しました。
環境
Windows11のWSLです。グラフィックドライバやコンパイル環境の導入は他の詳しい記事を参考にしてください。
$ nvaccelinfo
CUDA Driver Version: 12030
Device Number: 0
Device Name: NVIDIA GeForce RTX 4060 Ti
Device Revision Number: 8.9
中略
Default Target: cc89
また環境変数の設定にはmoduleコマンドを使用します。moduleコマンドは別途インストールが必要です。使用するmoduleの中身は
$ module show nvhpc-openmpi3/23.11
-------------------------------------------------------------------
/opt/nvidia/hpc_sdk/modulefiles/nvhpc-openmpi3/23.11:
conflict nvhpc
conflict nvhpc-nompi
conflict nvhpc-byo-compiler
conflict nvhpc-hpcx
conflict nvhpc-openmpi3
setenv NVHPC /opt/nvidia/hpc_sdk
setenv NVHPC_ROOT /opt/nvidia/hpc_sdk/Linux_x86_64/23.11
setenv CC /opt/nvidia/hpc_sdk/Linux_x86_64/23.11/compilers/bin/nvc
setenv CXX /opt/nvidia/hpc_sdk/Linux_x86_64/23.11/compilers/bin/nvc++
setenv FC /opt/nvidia/hpc_sdk/Linux_x86_64/23.11/compilers/bin/nvfortran
setenv F90 /opt/nvidia/hpc_sdk/Linux_x86_64/23.11/compilers/bin/nvfortran
setenv F77 /opt/nvidia/hpc_sdk/Linux_x86_64/23.11/compilers/bin/nvfortran
setenv CPP cpp
prepend-path PATH /opt/nvidia/hpc_sdk/Linux_x86_64/23.11/cuda/bin
prepend-path PATH /opt/nvidia/hpc_sdk/Linux_x86_64/23.11/compilers/bin
prepend-path PATH /opt/nvidia/hpc_sdk/Linux_x86_64/23.11/comm_libs/openmpi/openmpi-3.1.5/bin
prepend-path PATH /opt/nvidia/hpc_sdk/Linux_x86_64/23.11/compilers/extras/qd/bin
prepend-path LD_LIBRARY_PATH /opt/nvidia/hpc_sdk/Linux_x86_64/23.11/cuda/lib64
prepend-path LD_LIBRARY_PATH /opt/nvidia/hpc_sdk/Linux_x86_64/23.11/cuda/extras/CUPTI/lib64
prepend-path LD_LIBRARY_PATH /opt/nvidia/hpc_sdk/Linux_x86_64/23.11/compilers/extras/qd/lib
prepend-path LD_LIBRARY_PATH /opt/nvidia/hpc_sdk/Linux_x86_64/23.11/compilers/lib
prepend-path LD_LIBRARY_PATH /opt/nvidia/hpc_sdk/Linux_x86_64/23.11/math_libs/lib64
prepend-path LD_LIBRARY_PATH /opt/nvidia/hpc_sdk/Linux_x86_64/23.11/comm_libs/openmpi/openmpi-3.1.5/lib
prepend-path LD_LIBRARY_PATH /opt/nvidia/hpc_sdk/Linux_x86_64/23.11/comm_libs/nccl/lib
prepend-path LD_LIBRARY_PATH /opt/nvidia/hpc_sdk/Linux_x86_64/23.11/comm_libs/nvshmem/lib
prepend-path CPATH /opt/nvidia/hpc_sdk/Linux_x86_64/23.11/math_libs/include
prepend-path CPATH /opt/nvidia/hpc_sdk/Linux_x86_64/23.11/comm_libs/mpi/include
prepend-path CPATH /opt/nvidia/hpc_sdk/Linux_x86_64/23.11/comm_libs/nccl/include
prepend-path CPATH /opt/nvidia/hpc_sdk/Linux_x86_64/23.11/comm_libs/nvshmem/include
prepend-path CPATH /opt/nvidia/hpc_sdk/Linux_x86_64/23.11/compilers/extras/qd/include/qd
prepend-path MANPATH /opt/nvidia/hpc_sdk/Linux_x86_64/23.11/compilers/man
setenv OPAL_PREFIX /opt/nvidia/hpc_sdk/Linux_x86_64/23.11/comm_libs/openmpi/openmpi-3.1.5
-------------------------------------------------------------------
コンパイル時と計算時はこれをロードしています。
$ nvaccelinfo
No accelerators found.
Try nvaccelinfo -v for more information
のように表示された場合、以下のようにLD_LIBRARY_PATHに libcuda.so がある場所を追加したら実行できました。
$ export LD_LIBRARY_PATH=/usr/lib/wsl/lib:$LD_LIBRARY_PATH
$ nvaccelinfo -v
CUDA Driver Version: 12030
Device Number: 0
Device Name: NVIDIA GeForce RTX 4060 Ti
Device Revision Number: 8.9
Global Memory Size: 8585216000
Number of Multiprocessors: 34
Concurrent Copy and Execution: Yes
Total Constant Memory: 65536
Total Shared Memory per Block: 49152
Registers per Block: 65536
Warp Size: 32
Maximum Threads per Block: 1024
Maximum Block Dimensions: 1024, 1024, 64
Maximum Grid Dimensions: 2147483647 x 65535 x 65535
Maximum Memory Pitch: 2147483647B
Texture Alignment: 512B
Clock Rate: 2535 MHz
Execution Timeout: Yes
Integrated Device: No
Can Map Host Memory: Yes
Compute Mode: default
Concurrent Kernels: Yes
ECC Enabled: No
Memory Clock Rate: 9001 MHz
Memory Bus Width: 128 bits
L2 Cache Size: 33554432 bytes
Max Threads Per SMP: 1536
Async Engines: 1
Unified Addressing: Yes
Managed Memory: Yes
Concurrent Managed Memory: No
Preemption Supported: Yes
Cooperative Launch: Yes
Default Target: cc89
コンパイル
以下のようなスクリプトを書いて実行しました。
. /etc/profile.d/modules.sh
module load nvhpc-openmpi3/23.11
export CUDA_HOME=/opt/nvidia/hpc_sdk/Linux_x86_64/23.11/cuda/12.3
./configure --with-cuda=${CUDA_HOME} --with-cuda-runtime=12.3 \
--with-cuda-cc=89 --enable-openmp --with-scalapack=no --prefix=$HOME/.local/qe_gpu
make pw
make install
基本的にはREADME_GPUに書かれているそのままです。
–with-cuda-ccは nvaccelinfo を実行して下のほうに表示されたものです。
また、最後にprefixでインストール場所をgpu用のフォルダにしています。CPU用と分ける場合はこうするといいと思います。
追記
–with-cuda-mpi –enable-parallelのほうが若干速かったです。
. /etc/profile.d/modules.sh
module load nvhpc-openmpi3/23.11
export CUDA_HOME=/opt/nvidia/hpc_sdk/Linux_x86_64/23.11/cuda/12.3
./configure --with-cuda=${CUDA_HOME} --with-cuda-runtime=12.3 \
--with-cuda-cc=89 --with-cuda-mpi=yes --enable-parallel --with-scalapack=no --prefix=$HOME/.local/qe_gpu
make pw
make install
実行コマンド&ベンチマーク
実行するときも同じようなスクリプトを用意しました。
. /etc/profile.d/modules.sh
module load nvhpc-openmpi3/23.11
export PATH=/home/wsl/.local/qe_gpu/bin:$PATH
mpiexec -n 1 pw.x -in md.in |tee md.out
手元の環境でCPU版とGPU版のpw.xのベンチマークを実行してみました。計算に使用したのはこちらの記事で使用した水のモデルです。
中身を少し書き換えて、SCF計算のiterationを10回だけ回す計算にしました。つまり calculation を ‘scf’ に書き換えて、&ELECTRONSにelectron_maxstep=10を書きました。そして計算に使用したマシンのスペックは、
- CPU Ryzen 7 5700X 8コア16スレッド
- RAM 48GB
- GPU NVIDIA GeForce RTX 4060Ti (VRAM 8GB)
計算にかかった時間は以下のようになりました。
CPU OMP_NUM_THREADS=1 mpiexec -n 8 | GPU (–enable-openmp) OMP_NUM_THREADS=8 mpiexec -n 1 | GPU (–enable-parallel) OMP_NUM_THREADS=1 mpiexec -n 1 | |
init_run | 0.62 | 0.67 | 0.55 |
electrons | 13.78 | 6.97 | 6.78 |
fftw | 4.09 | 1.58 | 1.58 |
PWSCF (total) | 14.49 | 7.79 | 7.44 |
Totalの時間を見て分かる通り、GPU版のほうが2倍近く速かったです。中でもfftwの計算時間がCPUで4.09秒だったのがGPUでは1.58秒で、非常に速くなっていました。あとOpenMPはほとんど効いていないようです。
補足
CPU版とGPU版は計算結果が完全一致するわけではなく、異なる結果になります。(これはGPUだから違うというわけではなく、コンパイラが違うだけでも変わるものだと思います)
同じ構造でもSCFが収束するまでのIteration数も異なるため、上記のベンチマークではelectron_maxstepを指定してIteration数を揃えて比較をしました。
コメント
本記事やネット上の記事を参考にqeをGPU用にコンパイルしようとしているのですが、うまくいきません。管理者様がうまくいった方法を詳しく知りたいです。
https://catalog.ngc.nvidia.com/orgs/hpc/containers/quantum_espresso
のdocker imageも試してみたのですが、今のところうまく動かせていません。
ご教授頂けると幸いです。
参考になるか分かりませんが、nvaccelinfoの情報について記事に追記しました。
私も一発で上手くいったわけではなく、環境変数やコンパイルオプションをいろいろ変えて、上手くいったときの手順を記事にしています。またこの記事も完全なメモではなく、ここにない手順も必要だと思います。特にドライバやコンパイラのインストールは載せていません。(メモが残っていなかったので)
ちなみにコンパイルがどのあたりで止まるのでしょうか?
コンパイルは私も苦労しましたし、dockerで簡単に動けば楽ですよね。以前これも試したような気がするんですが、GPUの世代が非対応で断念したような気がします。
コンパイル以前に、環境構築で躓いています。
$ nvaccelinfo
nvaccelinfo: command not found
となってしまいます。何か入れないといけないのでしょうか?
環境は、wsl2のubuntuです。
環境は同じです。
$ which nvaccelinfo
/opt/nvidia/hpc_sdk/Linux_x86_64/23.11/compilers/bin/nvaccelinfo
ここに実行ファイルがありました。.bashrcでPATHを通しているわけではなく、moduleでnvhpc-openmpi3/23.11 でPATH登録されています。コンパイラーの動作に必要な環境変数はmoduleで設定しています。
ということは、HPC SDKをインストールしておく必要がありそうですね。
やってみます。ありがとうございます。
HPC SDKをインストールすると、コンパイルできるようになりました。
コンパイルに凄く時間かかりますね。
ありがとうございました。
HPC SDKを入れたことで、nvaccelinfoは通るようになりましたが、
module show nvhpc-openmpi3/24.5
で躓いています。
ご存じ出来たらご教授頂ければ幸いです。
$ nvaccelinfo
CUDA Driver Version: 12050
Device Number: 0
Device Name: NVIDIA GeForce RTX 4070 Ti
Device Revision Number: 8.9
Global Memory Size: 12878086144
Number of Multiprocessors: 60
Concurrent Copy and Execution: Yes
Total Constant Memory: 65536
Total Shared Memory per Block: 49152
Registers per Block: 65536
Warp Size: 32
Maximum Threads per Block: 1024
Maximum Block Dimensions: 1024, 1024, 64
Maximum Grid Dimensions: 2147483647 x 65535 x 65535
Maximum Memory Pitch: 2147483647B
Texture Alignment: 512B
Clock Rate: 2730 MHz
Execution Timeout: Yes
Integrated Device: No
Can Map Host Memory: Yes
Compute Mode: default
Concurrent Kernels: Yes
ECC Enabled: No
Memory Clock Rate: 10501 MHz
Memory Bus Width: 192 bits
L2 Cache Size: 50331648 bytes
Max Threads Per SMP: 1536
Async Engines: 1
Unified Addressing: Yes
Managed Memory: Yes
Concurrent Managed Memory: No
Preemption Supported: Yes
Cooperative Launch: Yes
Default Target: cc89
$ module show nvhpc-openmpi3/24.5
module: command not found
moduleは別途インストールが必要で、インストール後に/etc/profile.d/modules.shにmodule use –append /opt/nvidia/hpc_sdk/modulefilesを書くと動くと思います。
やってみます。
いつも適切なアドバイスをありがとうございます。
感謝しています。
GPUで計算出来るようになりました。
ありがとうございます。
GPUとCPUで計算速度の比較をしてみます。
管理人様の別ページの水の計算のファイルをGPUで計算してみたところ、
下記のようにGPUの計算は出来ているようなのですが、拡張子がoutのファイルができていないようです。GPUの計算でも拡張子がoutのファイルは出来るはずですよね?
謎です。
General routines
calbec : 19.75s CPU 10.47s WALL ( 20389 calls)
fft : 10.66s CPU 24.77s WALL ( 49077 calls)
13.97s GPU ( 45479 calls)
ffts : 7.45s CPU 8.40s WALL ( 6696 calls)
0.53s GPU ( 3098 calls)
fftw : 4.47s CPU 208.39s WALL ( 254600 calls)
204.55s GPU ( 254600 calls)
interpolate : 23.19s CPU 24.73s WALL ( 3598 calls)
Parallel routines
PWSCF : 50m26.91s CPU 52m46.46s WALL
This run was terminated on: 11:15:56 2Jun2024
=———————————————————————-=
JOB DONE.
=———————————————————————-=
Warning: ieee_divide_by_zero is signaling
Warning: ieee_inexact is signaling
FORTRAN STOP
まだCPUで計算してみていないので、何とも言えないですが、凄く速いような気がします。
outファイルの件は解決致しました。
実行時に出力指定しないと、作成されないのですね。
お騒がせ致しました。
管理人様の水のvc-mdのファイルをcpuとgpuで計算速度比較してみました。
7950X(16コア計算)
PWSCF : 8h57m CPU 9h36m WALL
4070Ti
PWSCF : 51m 3.12s CPU 53m11.25s WALL
GPUは、約11倍のスピードでした。
以上、ご報告まで。
ご報告ありがとうございます。4070Tiはすごく速いですね。本記事にも4060Tiでの結果を載せました。CPUの8コア計算と比較して約2倍でした。
4070Tiというだけでなく、コンパイル時のオプションの影響もあるかもしれないです
–enable-openmp
は使わずに、
–with-cuda-mpi=yes
–enable-parallel
を使いました
ありがとうございます。そのパターンも試してみました。速くはなりましたが大きな差はありませんでした。
.bashrcに
export LD_LIBRARY_PATH=/usr/lib/wsl/lib:$LD_LIBRARY_PATH
を追加してみましたが
$ nvaccelinfo -v
nvaccelinfo: command not found
となります。
Nvidiaのドライバ関係は難しいですね。
nvidia-smiコマンドは通ります。
$nvidia-smi
Sun May 26 17:01:31 2024
+—————————————————————————————–+
| NVIDIA-SMI 550.76.01 Driver Version: 552.22 CUDA Version: 12.4 |
|—————————————–+————————+———————-+
| GPU Name Persistence-M | Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap | Memory-Usage | GPU-Util Compute M. |
| | | MIG M. |
|=========================================+========================+======================|
| 0 NVIDIA GeForce RTX 4070 Ti On | 00000000:01:00.0 On | N/A |
| 0% 40C P8 7W / 285W | 1468MiB / 12282MiB | 0% Default |
| | | N/A |
+—————————————–+————————+———————-+
+—————————————————————————————–+
| Processes: |
| GPU GI CI PID Type Process name GPU Memory |
| ID ID Usage |
|=========================================================================================|
| No running processes found |
+—————————————————————————————–+
参考にさせていただいて4090でコンパイルしてみました。
ゲーム用だし倍精度はイマイチなんだろうと期待していませんでしたがausurf112のベンチで150secでした。
圧倒的なパワーですね!