CUDA Toolkitの利用方法

概要

CUDA Toolkit(以下CUDA)はNVIDIA社が提供するGPU向けの開発環境です。OpenACCやOpenMPを用いてGPUプログラムを記述するのと比べて記述量などは多めですが、GPUの持つ機能を最大限に引き出すことができるため、性能を重視する際に利用するのがおすすめです。

CUDAの詳細な情報、最新ドキュメントはNVIDIAのWebサイトを確認してください。


利用準備

CUDAを利用するには、あらかじめmoduleをloadしておく必要があります。CUDAを用いて作成したプログラムやライブラリをジョブとして実行する際は、ジョブスクリプト内でも同じmoduleのloadが必要です。

CUDAを利用するにはcudaモジュール(本資料作成時はcuda/12.2.2が最新かつデフォルト)をloadしてください。

MPIを使う場合はさらにMPI関係のmoduleもloadする必要があります。本資料作成時点では、gccモジュールを追加loadすることでhpcxompi-cudaompiがload可能になります。いずれもCUDAに対応したMPIであり、どれが最も高性能かについては調査中です。(基本的な使い方はいずれも同じです。)


プログラムのコンパイル方法

CUDAにはCUDA C向けのコンパイラが含まれており、nvccコマンドで利用することができます。GPUを持たないログインノードでもCUDA Cプログラムのコンパイルは可能です。

主なコンパイル時オプションとしては以下が利用できます。

コンパイル時オプション 説明
-c オブジェクトファイルの作成までを行います。(実行可能ファイルの作成を行いません。)
-o filename 出力される実行可能ファイル/オブジェクトファイル名をfilenameに変更します。デフォルトの実行可能ファイル名はa.outです。
-O|コンパイラがホストコード向けに行う最適化の度合いを指定します。ここで指定した情報はそのままホストコードをコンパイルするコンパイラ(標準ではgccコマンド)に引き渡されます。例:-O3
-g, -G デバッガ向けの情報を生成します。-gはホスト(CPU)コード向け、-Gはデバイス(GPU)コード向けのオプションです。
-lineinfo プロファイラ向けに行番号情報を生成します。プロファイラで分析を行う際には付けておくと良いでしょう。
-ccbin cmd ホストコードをコンパイルするコンパイラを指定したい場合に使います。例えばホストコードをIntelコンパイラ(icc)でコンパイルしたい場合は -ccbin icc のように指定します。
-Xcompiler option バックエンドコンパイラに渡すオプションを指定します。例えばホストコードをIntelコンパイラ(icc)でコンパイルする際にOpenMPによるスレッド並列化も有効化したい場合は -ccbin icc -Xcompiler -qopenmp のように指定します。
-arch, -gencode 実行対象とするGPUを指定します。何も指定しなくても問題ありませんが、-arch=sm_90 -gencode=arch=compute_90,code=sm_90 -gencode=arch=compute_90a,code=sm_90a -gencode=arch=compute_90a,code=compute_90aを指定するとHopper GPUでしか動作しないが高性能な実行可能ファイルが作成される可能性があります。
-I, -L, -l ヘッダファイルを探すパスの指定、リンクするライブラリファイルを探すパスの指定、リンクするライブラリの指定(他の多くのコンパイラと同様のため詳細は省略)

以下に幾つかのコンパイル例を示します。なおCUDA Cソースコードの標準的な拡張子はcuです。

  • CUDA Cプログラムをコンパイルする(非MPI版)
$ moudle load cuda
$ nvcc -O3 -o test ./test.cu
  • CUDA Cプログラムをコンパイルする(CPU並列化にOpenMPを使用、非MPI版)
$ moudle load cuda
$ nvcc -O3 -Xcompiler -fopenmp -o test ./test.cu
  • CUDA Cプログラムをコンパイルする(MPI版)
$ moudle load gcc hpcx cuda
$ nvcc -O3 -lmpi -o test ./test.cu
  • CUDA Cプログラムをコンパイルする(CPU並列化にOpenMPを使用、MPI版)
$ moudle load gcc hpcx cuda
$ nvcc -O3 -Xcompiler -fopenmp -lmpi -o test ./test.cu

バッチジョブの実行方法

CUDAを用いたプログラムを実行する際は、コンパイル時と同じmoduleをあらかじめloadしておいてください。

1GPUを用いたプログラムの実行例:

$ cat job_cuda.sh
#!/bin/bash
#PJM -L rscgrp=b-batch
#PJM -L elapse=10:00
#PJM -L gpu=1
#PJM -j

module load cuda
./a.out

デバッガやプロファイラの利用方法

HPC SDKのページを参照してください。nsysやncuなどのコマンドは cuda moduleをloadすれば利用可能です。