これからの並列計算のための GPGPU 連載講座 (IV)
特別編 CUDA プログラミング Windows 編
大島聡史
東京大学情報基盤センター

1

はじめに
第 二 回 お よ び 第 三 回 の 連 載 で は Linux を 対 象 と し て CUDA プ ロ グ ラ ミ ン グ の 流 れ や 最 適 化

方法を紹介してきた。しかし、CUDA に対応した GPU を搭載した計算機としては Windows がインストールされた PC のみを所有している利用者も多いようなので、今回は Windows 向けのCUDA プログラミングについて説明する。
なお、本記事の内容は Windows7(64bit) での利用を中心としている。他の Windows を利用する場合には適宜パスの読み替えなどを行っていただきたい。

2

CUI ベースの CUDA プログラム開発環境
まずは Linux を用いる場合と同様にコマンドラインで開発を行う手順を解説する。この方法

はインストール手順こそ Windows に特化した内容ではあるものの、実際の開発手順は Linux とほぼ同様のシンプルな方法である。

2.1 開発環境の導入
Windows に お け る 開 発 環 境 構 築 方 法 は 、す で に 第 二 回 の 連 載 で 述 べ た よ う に 、基 本 的 に はLinux と同様である。すなわち、まずは CUDA Driver と CUDA toolkit および CUDA SDK をインストールする。これらは全て NVIDIA のサイトにてインストーラ (exe ファイル) の形式で配布されており、ウィザードに従って処理を進めるだけでインストール処理は完了する。

Windows に お け る CUDA 開 発 に は Visual Studio が 必 要 で あ る 。本 稿 執 筆 時 点 の 最 新 開 発 環境である CUDA toolkit 3.1 および CUDA SDK 3.1 では Visual Studio 2005 および 2008 に対応していることが記されている。筆者は CUDA toolkit/SDK 3.0 もしくは CUDA toolkit/SDK 3.1 とVisual Studio 2008 Professional Edition の組み合わせにて動作を確認している。

2.2 開発の手順
Windows における開発の手順としては、Linux と同様に nvcc プログラムを実行してコンパイル・リンクを行えば良い。ただし、Visual Studio のコンパイラ本体である cl.exe 等へのパスが設定されていない (環境変数 PATH が設定されておらず、コマンドプロンプト上で cl.exe を実行するにはフルパス指定が必要な状態) の場合にはパスを指定する必要がある。
図 1 に CUDA プログラムをコンパイル・実行する例を示す。ちなみに図中で入力しているコマンドは以下の通りである:>nvcc -o chkdevice chkdevice.cu --compiler-bindir ‘‘C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\bin’’ -I ‘‘C:\Program Files (x86)\Microsoft Visual1

Studio 9.0\VC\include’’ -I ‘‘C:\ProgramData\NVIDIA Corporation\NVIDIA GPU Computing SDK\C\common\inc’’ -L ‘‘C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\lib’’ -L ‘‘C:\ProgramData\NVIDIA Corporation\NVIDIA GPU Computing SDK\C\common\lib’’ -lcutil32 -Xcompiler ‘‘/MTd’’ --machine 32
対象プログラムの中身は、システムに存在するCUDA対応デバイスの列挙をするだけのシンプルなプログラムである。この例ではcl.exeへのパスが設定されていない状況を想定して–compiler-bindirオプションを指定している。また、32bitのコード生成でcutilを使う想定をしているため-lcutil32を指定しているが、64bitのWindowsに64bitのCUDA toolkit/SDKを導入した場合、cutil64.libやcutil64.dllは存在するがcutil32.libやcutil32.dllは存在しないため、事前に用意しておく必要がある。これらを用意するには、C:\ProgramData\NVIDIA Corporation\NVIDIA GPU Computing SDK\C\commonにある cutil vc90.sln を Visual Studio で開いてビルドすれば良い。

図1

プログラムのコンパイルおよび実行の例

CUI での開発については以上の通りである。Linux 上での開発と比べると、nvcc に指定するオプションに若干の違い (ほとんどのオプションは同じように利用できる) やシェル (コマンドプロンプト) の機能差による使い勝手の違いはあるが、基本的に同じように開発できることがわかっていただけただろう。

3

GUI ベースの CUDA プログラム開発環境
続いて現在ベータ公開されている [1] 開発環境 NVIDIA Parallel Nsight(以下 Nsight と記す) について解説する。

3.1 NVIDIA Parallel Nsight の特徴
Nsight は Visual Studio に対するアドオンとして提供されている開発環境である。Nsight の主な機能 (特徴) は以下の通りである。

2• Visual Studio と統合された GUI インタフェース• GPU 実機を用いた高速なデバッグ実行• GPU カーネル内のステップ実行 (トレースデバッグ) が可能• プロファイラ等の機能も統合されている• グラフィックス開発用の機能も搭載• 有償版ではより強力なボトルネック解析機能等が提供される
Nsight はこのように様々な機能を提供しており、本稿で全てを解説することは困難である。
よって、今回は導入手順と GPU カーネル内のステップ実行方法を中心に基本的な使い方を解説する。なお、詳細な手順は Nsight(Host) をインストールすると閲覧できるようになる NVIDIA

Parallel Nsight User Guide にて解説されているので、あわせてご覧戴きたい。

3.2 Nsight の導入
まずは Nsight の入手方法についてであるが、Nsight を入手するためには無料登録可能な Betaaccount を入手する必要がある。Beta account を入手すると、Host と Monitor の 2 つのプログラムを入手できるようになる。Host は Visual Studio と統合される開発環境、Monitor は実際に GPU
へ ア ク セ ス す る プ ロ グ ラ ム で あ り 、1 台 の PC で 開 発 を 行 う 場 合 (ロ ー カ ル デ バ ッ グ) に は Hostと Monitor の両方をインストールする。また開発環境とデバッグに使う CUDA 対応 GPU を別のPC にする場合 (リモートデバッグ) には、開発環境に Host を、CUDA 対応 GPU が搭載された PCに Monitor をインストールする。
なおローカルデバッグを行うためには、デバッグ対象となる CUDA 対応 GPU 以外にもう 1 つGPU が存在する必要がある。また、起動時にディスプレイと接続されていない GPU は Windowsから認識されないため注意しなくてはならない。

Nsight(Host,Monitor) のインストール後は、さらに以下の手順にそって開発の準備を行う必要がある。Monitor の設定は Nsight Monitor 起動後にタスクトレイに格納されるアイコンの右クリックメニューから、Host の設定は Visual Studio に追加されているメニュー (図 2) から行うことができる。

1. TDR の無効化
Monitor のオプションから “WDDM TDR enabled” を False に設定して再起動する。これ
により、ディスプレイドライバが 2 秒以上応答しなかった場合に Windows によってプロセスが終了させられるという問題 (Windows の仕様) を回避することができる。

2. WPF の D3D アクセラレーションの無効化 (ローカルデバッグのみ)
C:\Program Files (x86)\NVIDIA Parallel Nsight 1.0\Common\DisableWpfHardwareAcceleration.regを実行して再起動する。

3. Aero の無効化
Monitor が動作する PC では Aero を無効化しておかねばならない。
4. Nsight の認証

3

Host の Nsight オプションに認証のための UI があるので有効化する。
5. (オプション) セキュア接続設定
Monitor と Host 双方でセキュア接続の設定をすることができる。
6. (オプション) ヘッドレスモードの設定 (ローカルデバッグのみ)
Monitor が動作する PC では、NVIDIA コントロールパネルにてデバッグ用 GPU のディスプレイ出力を無効化し、PhyX アクセラレーション対象をデバッグ用 GPU に設定すること で 、対 象 GPU を CUDA デ バ ッ グ に 専 念 さ せ る こ と が で き る よ う に な る 。こ れ に よ り

Windows のデスクトップ処理等の影響が無くなるので良いとされている。

図 2 Nsight が組み込まれた Visual Studio の画面 (メニューに Nsight が、ソリューションエクスプローラのアイコンメニューに Nsight のアイコンが追加されている)

3.3 Nsight を用いたデバッグの手順
Nsight を用いてデバッグをする前に、まずは CUDA を用いたプログラムを Visual Studio 上で作成する必要がある。以前から Visual Studio のカスタムビルド規則ファイルや CUDA 用のウィザードが web 上でいくつか公開されていたが、現在では Nsight を導入するとカスタムビルド規則が追加されるようになっており、.cu ファイルをプロジェクトに追加する際やプロジェクトの設定 (ソリューションエクスプローラでプロジェクトを選択した状態でプロジェクトメニューを開き、カスタムビルド規則を選ぶ) を開けば Nsight CUDA Runtime Api Build Rule v3.1.0 な
ど の 名 前 の 規 則 が 選 択 で き る 。も し こ れ ら の 規 則 が 見 つ か ら な い 場 合 は 、規 則 設 定 画 面 で 既存ファイルの検索を選び、C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v3.1 から.rules ファイルを選択すれば良い。

4

以上の設定によってカスタムビルド規則を設定すれば、あとは通常のプロジェクト同様にビルドを行うことで CUDA 対応アプリケーションが作成可能になる。プロジェクトのプロパティからカスタムビルド規則の設定画面 (プロパティページの構成プロパティツリー最下部に追加されている) を開けば、nvcc に与える各種オプションを GUI から選択することもできるので、追加のインクルードディレクトリなどが必要な場合は設定すると良いだろう。

Nsight を用いたデバッグについては、GPU カ ーネ ル内に ブレークポ イントを 設置したり ス
テ ッ プ 実 行 し た り す る だ け で あ れ ば 、任 意 の 位 置 に ブ レ ー ク ポ イ ン ト を 設 置 し た 後 で Nsight
メニューの中にある Start CUDA Debugging で実行すれば良いだけである。ただし、GPU カーネル内部のデバッグをしたい場合は Nsight メニューの Start CUDA Debugging を、ホスト側のデバッグをしたい場合はデバッグメニューのデバッグ開始を選ぶよう使い分ける必要がある。
また、実行時引数の与え方についても、Start CUDA Debugging から起動する場合には NsightUser Properties(ソリューションエクスプローラのアイコンメニュー、もしくはソリューションエクスプローラ上でプロジェクト名を選択して右クリックし Nsight User Properties を選択) で表示される UI を用いて引数を設定する必要がある。ローカルデバッグを行うかリモートデバッ
グ を 行 う か の 指 定 に つ い て は 、Nsight User Properties 中 の Launch 中 に あ る Connection name:を localhost にするか他のホスト (IP もしくは名前解決可能なホスト名) にするかで制御する。
幸い、Nsight は設定の不具合などがある場合にはポップアップや出力ウィンドウへの出力で具体的な問題点などを指摘してくれるため、各種の設定に抜けや間違いがあった場合でも比較的容易に気がつくことができるだろう。

図 3 GPU カーネルのステップ実行例 (SharedMemory 上の配列 smData の中身を確認できている)5

Nsight を用いたデバッグ (GPU カーネルのデバッグ) 中の操作については、通常の Visual Studioと同様にステップ実行やメモリ内容の確認を行うことができる (図 3)。一方で Nsight 独特の操
作 と し て は 、Block や Thread を 切 り 替 え て の ス テ ッ プ 実 行 が 挙 げ ら れ る 。Nsight メ ニ ュ ー のCUDA Debug Focus メニューがこれに該当しており、ステップ実行時に本メニューから対象となる Block および Thread を選択することが可能となる。
他の機能としてはプロファイラ機能が統合されている (図 4)。Nsight メニューから New Analysis

Activity を選ぶと表示される UI にてプロファイル対象を選択して Launch ボタンを選択すれば、アプリケーション全体や GPU カーネルなどの実行情報を自動的に収集し、表やグラフによって表示してくれる機能である。デバッガとあわせて活用することで CUDA 最適化プログラミングがより容易になるだろう。

図4

プロファイラ機能 (左側は設定画面、右側はタイムライン表示画面)

以 上 、第 四 回 の 今 回 は 予 定 を 変 更 し て Windows 向 け の CUDA 開 発 環 境 に つ い て 紹 介 し た 。

Windows と Linux で全く同じプログラムが動かせるかが使っているライブラリ等により左右されてしまうのは周知の事実であるが、Nsight のデバッグ機能は非常に強力なので、Linux 向けの CUDA プログラミングを行っている人も使ってみる価値があるだろう。

(次回に続く)参考文献[1] NVIDIA. Nvidia parallel nsight, http://developer.nvidia.com/object/nsight.html.

6