QEをGPU用にコンパイル

QE

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_run0.620.670.55
electrons13.786.976.78
fftw4.091.581.58
PWSCF (total)14.497.797.44
Time report (wall time [s])

Totalの時間を見て分かる通り、GPU版のほうが2倍近く速かったです。中でもfftwの計算時間がCPUで4.09秒だったのがGPUでは1.58秒で、非常に速くなっていました。あとOpenMPはほとんど効いていないようです。

補足
CPU版とGPU版は計算結果が完全一致するわけではなく、異なる結果になります。(これはGPUだから違うというわけではなく、コンパイラが違うだけでも変わるものだと思います)
同じ構造でもSCFが収束するまでのIteration数も異なるため、上記のベンチマークではelectron_maxstepを指定してIteration数を揃えて比較をしました。

コメント

  1. harrods より:

    本記事やネット上の記事を参考にqeをGPU用にコンパイルしようとしているのですが、うまくいきません。管理者様がうまくいった方法を詳しく知りたいです。

    https://catalog.ngc.nvidia.com/orgs/hpc/containers/quantum_espresso
    のdocker imageも試してみたのですが、今のところうまく動かせていません。

    ご教授頂けると幸いです。

    • オレンジ酸 管理人 より:

      参考になるか分かりませんが、nvaccelinfoの情報について記事に追記しました。

      私も一発で上手くいったわけではなく、環境変数やコンパイルオプションをいろいろ変えて、上手くいったときの手順を記事にしています。またこの記事も完全なメモではなく、ここにない手順も必要だと思います。特にドライバやコンパイラのインストールは載せていません。(メモが残っていなかったので)
      ちなみにコンパイルがどのあたりで止まるのでしょうか?

      コンパイルは私も苦労しましたし、dockerで簡単に動けば楽ですよね。以前これも試したような気がするんですが、GPUの世代が非対応で断念したような気がします。

  2. harrods より:

    コンパイル以前に、環境構築で躓いています。
    $ 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で設定しています。

      • harrods より:

        ということは、HPC SDKをインストールしておく必要がありそうですね。
        やってみます。ありがとうございます。

      • harrods より:

        HPC SDKをインストールすると、コンパイルできるようになりました。
        コンパイルに凄く時間かかりますね。
        ありがとうございました。

      • harrods より:

        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を書くと動くと思います。

          • harrods より:

            やってみます。
            いつも適切なアドバイスをありがとうございます。
            感謝しています。

          • harrods より:

            GPUで計算出来るようになりました。
            ありがとうございます。
            GPUとCPUで計算速度の比較をしてみます。

          • harrods より:

            管理人様の別ページの水の計算のファイルを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で計算してみていないので、何とも言えないですが、凄く速いような気がします。

          • harrods より:

            outファイルの件は解決致しました。
            実行時に出力指定しないと、作成されないのですね。
            お騒がせ致しました。

          • harrods より:

            管理人様の水の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倍でした。

          • harrods より:

            4070Tiというだけでなく、コンパイル時のオプションの影響もあるかもしれないです
            –enable-openmp
            は使わずに、

            –with-cuda-mpi=yes
            –enable-parallel
            を使いました

          • オレンジ酸 管理人 より:

            ありがとうございます。そのパターンも試してみました。速くはなりましたが大きな差はありませんでした。

  3. harrods より:

    .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 |
    +—————————————————————————————–+

  4. HAJIME NAKABAYASHI より:

    参考にさせていただいて4090でコンパイルしてみました。
    ゲーム用だし倍精度はイマイチなんだろうと期待していませんでしたがausurf112のベンチで150secでした。

タイトルとURLをコピーしました