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することでhpcx
、ompi-cuda
、ompi
が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版)
|
- CUDA Cプログラムをコンパイルする(CPU並列化にOpenMPを使用、非MPI版)
|
- CUDA Cプログラムをコンパイルする(MPI版)
|
- CUDA Cプログラムをコンパイルする(CPU並列化にOpenMPを使用、MPI版)
|
バッチジョブの実行方法
CUDAを用いたプログラムを実行する際は、コンパイル時と同じmoduleをあらかじめloadしておいてください。
1GPUを用いたプログラムの実行例:
|
デバッガやプロファイラの利用方法
HPC SDKのページを参照してください。nsysやncuなどのコマンドは cuda
moduleをloadすれば利用可能です。