とりあえずのメモであり、設定の漏れなどがある可能性は否定できません。暫定。
VisualStudioに統合されたCUDAデバッガ。実際にCUDA対応のGPUを用いるハードウェアデバッガ。一時期NVIDIA Nexusという名前で発表されていたモノ。商標やら何やらの都合で名称変更したのかな?
Betaプログラムに無料登録するとダウンロード可能になる。
HostとMonitorが組になっており、HostがVisualStudioと統合された環境、MonitorがGPUにアクセスするプログラム。両方同じPCに導入するローカルでバッグと、それぞれ個別に導入するリモートデバッグが可能。HostもMonitorもWindowsが必要なことを考えるとローカルデバッグの方がやりやすそうな気がするけど、実はローカルデバッグを行うにはGPUが2枚必要。1枚がCUDA対応ならOKなのは救いだが、物理的に2枚のGPUが刺さらないような環境の人はご愁傷様と言わざるを得ない。
VisualStudio2008(以下VS2k8)とNVIDIAドライバとHostとMonitorをインストールする。ToolkitやSDKは不要、というかNsightに最新版が入っている。
(実際にToolkitとSDKが入っていない環境を使ったわけではないので、もしかしたら間違っているかも?)
インストールは単純にインストーラを実行するだけでOKだが、後述するようにインストール後の設定は必要。
インストールするとスタートメニューに「NVIDIA Parallel Nsight 1.0」および「NVIDIA Parallel Nsight Monitor 1.0」というフォルダが追加される。前者に「User Guide」が含まれているのでこれに従えば良い、が、全部英語で悔しい人もいると思うので簡単に解説しておく。
(Installation and Setup EssentialsとWalkthroughを斜め読みすれば何とかなるので、できれば読んで欲しい。)
簡単に説明すると、以下のような準備作業が必要:
- VS2k8とドライバとHostとMonitorの導入(済)
- Minitorを起動しオプションをいじる
- Hostを起動しオプションをいじる
それから、GPUの接続にはちょっと注意が必要。
1つのGPUに表示とデバッグを行わせると、不具合が起きる……かもしれない。ので、回避する。
デバッグに使いたいGPUもDVIでモニタにつないだ状態で起動し、NVIDIA コントロールパネルで出力を切る。運用を間違えるとディスプレイがもったいない気はするが、なんとかする。
このへんは「UserGuide」の「How To: Setup Local Headless GPU Debugging」に絵が付いているので、英語がわからなくてもそちらを見た方が良い。(メニュー項目さえ読み替えれば良いので。)
ついでに、Aeroが有効な状態だとデバッグできないようなので、Windows7ベーシックテーマを使うように設定するなどして回避しておく。(個人的にAlt+Tabがしょんぼりになるのが嫌なのだが……。)
(UserGuideではHostが先なんだけど、気にしない。)
Monitorを起動すると、UAC警告・防火壁設定あたりが出た後にタスクトレイにアイコンが増える。右クリックから「Options…」を選ぶと設定画面が出る。
左のツリーで「Security」を選び、右のEnabled secure serverをTrueにする。リモートデバッグを行う場合はEnable per machine permissions等もいじる……はずなのだが、一度Trueで接続確認したあとはFalseにしてもつながってしまった。Trueだと接続コントロールあり、Falseだと接続コントロール無し=誰でもつながれる、かも?
それから「General」の「WDDM TDR enabled」はFalseにしておくこと。これはおそらく「ドライバによるGPUアプリ強制n秒殺し」回避だと思われる。
Monitorの設定はこれだけ。ポップアップで再起動を促されることもあるので、その際は素直に右クリックメニューから終了して起動し直すべし。
Hostの設定というか、そもそもデバッグするプログラム(VS208プロジェクト)が必要なのだが、とりあえず全般的な設定から。
VS2k8を起動するとMonitor同様のアイコンやNsightと書かれたメニュー追加されているのに気がつくはず。Nsightメニューから「Nsight Options…」を選んで設定ダイアログを出し、GeneralのSecurityのEnable secure connectionをTrueにしておく。
プロジェクトファイルは
C:\ProgramData\NVIDIA Nsight 1.0\Samples\CUDA\Debugging\Matrix Multiply
にある行列積を使ってみる。
matrixMul_vc90.vcprojを開けば良い。
ソリューションエクスプローラでプロジェクト名を右クリックするとNsight User Propertiesというメニュー項目があるので選択し、設定ダイアログを出す。
Launch OptionsのConnection name:にMonitorのアドレス(IPでも名前でも、ネットワーク的に理解可能ならOK)を記入する。ローカルデバッグならlocalhostでOK。
メニューのNsightからStart CUDA Debuggingを選べばOK。
うまくいかない場合はHost側=VS2k8の出力やらMonitorのポップアップやらでエラーが見えるはずなので、なんとかする。
Nsightメニュー内にある「Enable CUDA Kernel Launch Debugging」が有効ならGPU kernel内の変数トレースも可能。メモリダンプ的なことも可能。
「CUDA Debug Focus…」を選んで出てくるGUIを使えばBlockやThreadを選んで変数をチェックすることも可能。
「New Analysis Activity」を選んで出てくるGUIを使えばプロファイリングも可能。(非常に大雑把に言うと、適当にオプションをいじって下の方にあるLaunchを押せばOK。)
リモートデバッグ時には実際にアプリが動くのはMonitor側になるわけだが、ここでEnterを押したら終わるようなプログラムを動かすと、ちゃんとMonitor側で押してあげないと駄目になるわけで、手元にMonitorが無いと残念なことになる。
だいたいこんなかんじです。