CUDA6のNSight Eclipse EditionでCUDAのリモート開発を試す

日本時間の4月16日にリリースされたCUDA6の記事を読んでいたらRemote Development with NSight Eclipse Editionというとても気になるものが書かれていたので試してみました。

*編集と実行、デバッグに関してはCUDA6からではなく前のバージョンからもできるようです。



#検証環境
Local : 
OS: Ubuntu 13.04 (VMWare上)
CUDA: 6.0 (ドライバーはインストールしていない)

Remote :
OS: CentOS6
CUDA: 6.0  

ローカル、リモートともに、PATHとLD_LIBRARY_PATHは通してあります。

#NSightの起動
ローカル環境でNSightを起動します。パスが通してあるなら以下のコマンドで起動できます。
```bash
$ nsight
```

#プロジェクトのRemote環境の設定
Remote環境の設定はプロジェクトを作成時または左のProject Explorerの変更したいプロジェクトのところで右クリックして[Properties]を選択し、[Build]→[Target Systems]のところから設定できます。

今回はプロジェクト作成時から設定する流れを示します。

まず、Project Explorerのところで右クリックをして、[New]→[CUDA C/C++ Project]を選択。

下のような画面がでるのでProject nameを好きな名前（ここではremote-test）にして
CUDA Runtime Projectを指定して[Next>]をクリック
![new_cuda_project.png](https://qiita-image-store.s3.amazonaws.com/0/21366/b569a59a-cb58-f65b-f7fa-f7ccae7ab164.png)

次はCUDAのソースコードの場所とコンパイルのときの設定なのでここではデフォルトにして[Next>]。
下の画面に来たらManageを押して、Remote環境の登録をします。
![Target Systems.png](https://qiita-image-store.s3.amazonaws.com/0/21366/62d52fcd-f8af-9162-0fb9-f62e243767f5.png)

下の画面で[Add]をクリックして新しいRemote Connectionを作り、Remote環境のHost name、User nameを入れます。LableはConnectionのラベルなので各自わかりやすいものをつけてください。
![New Remote Connection.png](https://qiita-image-store.s3.amazonaws.com/0/21366/328b47bc-ffea-fd09-d2a0-ea2843a60981.png)

これで設定は完了なので[Finish]をクリックしてNew Remote Connectionのウインドウを閉じてください。

新しいConnectionが追加されているのでRemoteのProject PathとCUDA Toolkitの場所を指定してください。このとき、CUDA Toolkitの場所とはCUDA Toolkitをインストールしたパスではなくインストールした先のパスの直下にあるbinのパスになります。
なのでデフォルトの場合「/usr/local/cuda-6.0/bin」となります。
![remote_path.png](https://qiita-image-store.s3.amazonaws.com/0/21366/07d0aebc-50d5-0e58-8a4b-9773cc5dabe8.png)
これでCUDA C/C++ Projectは[Finish]をクリックして終わってください。

Remoteの設定中Browseを押したりするとパスワードを求められますので適宜入力してください。

#Remote環境でプログラムを実行
サンプルのプログラムをRemoteで実行してみます。
まず、上のバーのBuildボタンの隣の矢印（下のボタン）からRemoteのReleaseを指定してビルドします。
![build_botton.png](https://qiita-image-store.s3.amazonaws.com/0/21366/51436eb1-87e7-7c93-5f99-18978fca6f2e.png)
この時点でRemoteの設定したパスのところにプロジェクトの内容がコピーされています。
このあと上のバーのRunボタンの右の矢印（下のボタン）から[Run as]→[Remote C/C++ Application]を選択します。
![Run_bottun.png](https://qiita-image-store.s3.amazonaws.com/0/21366/31e19339-3c71-917a-5cd2-c80b57d2380f.png)
*[Run as]のところで[Remote C/C++ Application]が選択できないようになっている場合、バイナリが作られていない、もしくは更新が認識されていないなどが考えられます。更新が認識されていないときは、Project Explorerでプロジェクト名のところで右クリックをして[Refresh]を選択してみてください。

出てきたウィンドウでRemote connectionのところで実行するRemoteを指定して[Finish]をクリック。

しばらくすると下のコンソールに出力結果がで、最後にlogoutと出てれば実行成功です。


#Remote環境でデバッグを実行
*LocalとRemoteのCUDAのバージョンが不一致だとエラーがでるので気をつけてください。
マニュアルを見るとRemote環境でデバッグするときはいつもとちょっと違うので注意してください。
一番上のステータスバーの[Run]（実行したときのボタンじゃないよ！）→[Debug　Remote　Application]を選択。


出てきたウインドウで[Debug an application on a remote system]を選択。


次のウインドウでRemoteを指定して[NEXT>]。
次のウインドウもCUDA ToolkitのPathに問題ないか確認して大丈夫なら[NEXT>]。
最後に実行の設定に名前をつけるのですが、お好みで。私はデフォルトで行きます。

名前をつけたら[Finish]を押して完了です。

これでデバッグ実行可能です。一度、設定してしまえば、Runボタンの左のデバッグ実行から実行できます。
NSightの魅力の一つであるGUIでデバッグができます。ブレイクポイントもLocalのときとなんらかわらず使えます。なんてすばらしい！

#Remote環境でProfileを実行
プロファイルのほうはLocalとほとんど同じようにRemoteで実行できます。
Profileボタンの矢印（下のボタン）をクリックして[Profile as]→[Remote C/C++ Application]をクリック。これだけです。楽チンですね。
![profile_bottun.png](https://qiita-image-store.s3.amazonaws.com/0/21366/11aa5f26-9f41-7375-12ff-f39c68f29415.png)

*Profileを複数人でやるときは/tmp/nvvp/launchのパーミッションに注意してください。どうもプロファイルを取るときに、ここを使っているらしく、書き込み権限がなくて最初エラーを吐かれました。

#参考資料
CUDA Toolkitを入れたところの/doc/pdfのところにマニュアルがあります。

#最後に
リモートでNSight動かすとすごく重いし・・・Localは仮想環境で主に開発してるのでCUDA使えないし・・・仮想環境じゃなくてもGPU古いし・・・と思ってましたがとうとうそんなことを気にしなくても良くなりました。ホントにすばらしい！