GPU Compute ガイド

../_images/FE_logo_345_60.png
Fabric Engine version 2.4.0
Copyright (c) 2010-2017 Fabric Software Inc. All rights reserved.

重要 - はじめにお読みください

  • 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デバイスが必要です。手持ちの機器が対応しているか、以下に従い確認しましょう。

GPU Compute を有効にする

Fabricはディフォルトで Nvidiaのライブラリを読み込みには行きません。環境変数 FABRIC_FEATURE_CUDA_COMPUTE=1 を設定するとGPUコンピューティングが有効になり、Fabric起動時に関連ライブラリが読み込まれるようになります。エラーがあればコンソールに出力されます。

GPUコンピューティングには、Nvidiaのライブラリ群を動作システムのグローバル設定に置く ―もしくはPATH や LD_LIBRARY_PATHに明示的に追加する必要があります。

Windows では必要なライブラリは nvvm64_20_0.dllnvcuda.dll です。ディフォルトで C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v6.0\binC:\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.solibnvvm.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*() の呼び出しを大量に行うと、オペレータがハングし何も返さなくなります。