GPU Compute ガイド¶
重要 - はじめにお読みください¶
- GPUコンピューティング機能はFabric Engineのアプリケーションからはディフォルトで無効となっています。使用するには環境に応じ有効化する必要があります。
- GPU Compute プログラミングガイド に GPU処理に適したKLコードの記述についての情報があります。
- 既知の不具合 をご覧ください
- GPUでコードを実行する際、guardedモードと unguardedモードの違いは、CPU上実行する場合より極めて重要な意味を持ちます。コードをデバッグし、実戦投入するようになると、unduardedモードで実行すると極めて大きいパフォーマンスメリットを受ける場合がある事に気づくでしょう。
- GPUコンピューティングは現在 Windows 7(以降)と Linux(CentOS 6.x) 64-bit プラットフォームで NVIDIAの対応デバイス(後述)を使用している場合に利用できます。
インストール¶
対応 NVIDIA ハードウェア¶
KLのGPUコンピューティングには対応する NVIDIAデバイスが必要です。手持ちの機器が対応しているか、以下に従い確認しましょう。
- グラフィックカードの CUDAバージョン 3.0以上必要です。GPUの一覧は: https://developer.nvidia.com/cuda-gpus
- さらに NVIDIA の stableドライバのインストールが必要です: http://www.nvidia.com/Download/index.aspx?lang=en-us
- CUDA toolkit 6 or later must be installed from https://developer.nvidia.com/cuda-downloads The current version was built against CUDA 6.0 but should work up to CUDA toolkit 7.5
GPU Compute を有効にする¶
Fabricはディフォルトで Nvidiaのライブラリを読み込みには行きません。環境変数 FABRIC_FEATURE_CUDA_COMPUTE=1
を設定するとGPUコンピューティングが有効になり、Fabric起動時に関連ライブラリが読み込まれるようになります。エラーがあればコンソールに出力されます。
GPUコンピューティングには、Nvidiaのライブラリ群を動作システムのグローバル設定に置く ―もしくはPATH や LD_LIBRARY_PATHに明示的に追加する必要があります。
Windows では必要なライブラリは nvvm64_20_0.dll
と nvcuda.dll
です。ディフォルトで C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v6.0\bin
と C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v6.0\nvvm\bin
にインストールされます。これらのディレクトリを PATH に通すと良いでしょう:
PATH=C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v6.0\bin;C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v6.0\nvvm\bin;%PATH%
Linux に必要なライブラリは libcuda.so
を libnvvm.so
です。通常 /usr/local/cuda/lib64
と /usr/local/cuda/nvvm/lib64
にあります。LD_LIBRARY_PATH を次のように更新すると良いでしょう:
LD_LIBRARY_PATH=/usr/local/cuda/lib64:/usr/local/cuda/nvvm/lib64:$LD_LIBRARY_PATH
環境変数 CUDA_PATH
がシステムに必要です。ただしこれは CUDA toolkit インストーラにより自動で設定されているでしょう。
Linux での CUDA comput 環境変数設定シェルスクリプト例:
export FABRIC_FEATURE_CUDA_COMPUTE=1
export CUDA_PATH=/usr/local/cuda
export LD_LIBRARY_PATH=$CUDA_PATH/lib64:$CUDA_PATH/nvvm/lib64:$LD_LIBRARY_PATH
GPU Compute を試す¶
Samples/Canvas
フォルダ以下に GPUを活用するサンプルがあります。nbody-gpu.canvas という名のファイルです。上述したようにunguarded モードで実行すると極めて大幅なパフォーマンス向上が見込めます。canvas の実行に -u フラグをつけてみましょう。
KLプログラミング¶
GPU Compute プログラミングガイド にKLからのGPU処理についてより詳しい情報があります。
既知の不具合¶
- GPUでの実行に10秒以上要するカーネルは、ドライバから強制的に終了され、CUDA_ERROR_LAUNCH_TIMEOUTエラーが返ります。今後のリリースで解消される見込みです。
- Nvidiaのコンパイラは、特に巨大なKLオペレータを解釈する際、非常に長い時間かかることがあります。GPU処理が始まる際、NVIDIAコンパイラ ―LLVM IRを受け取りPTXアセンブリを出力する― とCUDAオペレータの読み込み ―LLVM IRからPTXアセンブリコードを準備する― に要する時間がFabricのログに記録されます。、どのような種類のオペレータが処理遅延を引きおこすのか、どのように緩和すればいいのかについてFabricでは調査を続けております。
- Linux上で稀に、NVIDIAドライバがハングしマシンの再起動を要する事があります。これはNVIDIAのドライバで発生し、NVIDIAが解決するべきバグです。このバグは別個のプロセスから、GPU処理を伴う複数のKLオペレータを同時に実行した際に発生します。このためGPU処理を行う場合は、1つのFabricプロセスに限定することを推奨いたします。
- 単一のGPU KLオペレータで Integer.atomic*() の呼び出しを大量に行うと、オペレータがハングし何も返さなくなります。