プログラミング忘備録

プログラミングやゲームに関することをつらつらと

WSLだとCUDAプログラミングを十分に学べないのでNVIDIA Nsight Systemsを頑張って使ってみた話

タイトルまんまです。

 

WSL使ってCUDAプログラミングをやろう

マンガでわかるGPU最適化の本を読んでいたのですが、技術的に並列処理を勉強したくなったので、CUDAの本を買いました。


 

ただ、この参考書、CUDAのGPUプロファイリング(作成したプログラムが効率よく並列処理できているかを見る)の章においてnvporfを使っていました。私の場合はエラーが出てきてうまくプロファイル出来なかったので調べてみると、nvprofは最新のCUDAで非推奨とのこと。最新のCUDAにも対応したnsysコマンド

nsys profile --trace=cuda,cudnn,cublas --output=report5 --force-overwrite true ./sample

を使用してみましたが、こちらもエラー。正確に言うと、printfなんかは出力しているし、GPUへのアクセスもできるのですが、プロファイルを記載した出力ファイルには「○○にアクセスできませんでした」的なのが書いてある。
ChatGPTもGithub Copilotもきちんと答えてくれなかったので、ネットで調べたら一発ヒット 。

ようは、WSLでnsysコマンド使ってプロファイルは困難とのこと。もしかしたら、nvprofも同じ理由で使えないのかな?forums.developer.nvidia.com

 

ChatGPTに確認すると、

はい、その通りです。サイトに記載されている通り、**WSL2**では一部のCUDAメトリックやGPU関連の情報へのアクセスが制限されており、完全なLinux環境での実行と比べると、いくつかの制限があります。

### WSL2とCUDAの制限:

  • **WSL2環境では、CUDAのメトリック**(例: メモリ使用量、GPUの温度、演算性能など)やその他の詳細なパフォーマンス情報にアクセスできない場合があります。
  • 一部のメトリックに関しては、WSL2上で正常に動作しないことがあり、例えば`nvidia-smi`でのプロファイリングやGPUの詳細な状態確認が制限されることがあります。

### 解決策:

  • **完全なLinux環境を使用**することが最も確実な方法です。物理的なLinuxマシンや、仮想マシンVM)上のLinuxディストリビューションを使用すると、すべてのCUDAメトリックにアクセスできるため、プロファイリングがスムーズに行えます。
  • **WSL2での開発**は一部の用途には便利ですが、メトリックの取得や詳細なプロファイリングが必要な場合は、物理的なLinux環境に移行することをお勧めします。

### まとめ:
WSL2では一部のCUDAメトリックにアクセスできないため、プロファイリングが完全には行えない可能性があります。もしその情報が重要であれば、完全なLinux環境に移行するか、あるいは別のツールでの解析を検討する必要があります。

 

ようは、WSLだとCUDAメトリック(パフォーマンスの指標データらしい)というのにアクセスできないのが原因らしいです。最初から教えろよゴミAIめ...

頑張ればできるのかもしれませんが、労力に見合わないということでCUDAプログラミングは断念...

 

普通にWindowsで実行すればいいのでは?

「Jetsonとか買って、やるしかねえかなあ」とか思っていたんですが、後日、「普通にWindows使えばいいじゃん」ということに気づきました。
Nvidia Driverは入っているので、WindowsでCUDAを使うためのCUDA Toolkitをサイトからインストール。
developer.nvidia.com

自分の環境を選んで、ネットワーク経由しないローカルでのインストーラーをダウンロード (3GB近いファイルサイズに驚く)。

 

私は上級者じゃないので「適当にOK押して進めていっても大丈夫だろう」といういい加減な感じで、Yesの選択肢押しまくって最後まで進める。


 

インストールに成功すると、デスクトップにGeForce Experienceというショートカットが作成され、何するのかよくわからない画面が開けるようになります。


 

興味があるのはCUDAプログラミングで、このソフト自体に興味ないので、設定からドライバーが入っていることだけ確認(バージョンが記載してある)。
さらに、Windows Powershellを開いて、

nvcc --version

で無事にバージョンが表示されることを確認。



 

WindowsLinux問わず、これが表示されると、CUDAでGPUを使ったプログラムができるようになったという証拠らしいです。インストールしたのにバージョンが表示されない場合は、環境パスを通せば行ける模様。

さあ、「準備は整ったので、Visual Studioでnvccを実行しよう!」と思ったのですが、

 

そういえば、Windows上でのビルドコマンドってみたことないなあ

→調べると超複雑な入力と出力がでてきたので、無理なことを悟る

 

といった感じで、コマンドからの実行は諦めました。

ツールなどから実行コマンドが設定できるらしいのですが、複雑でハードルが高すぎる...

 

NVIDIA Nsight Systems

何かいい方法がないかと、VScode拡張機能のNsight Systemsで実行したり(デバックの設定がうまくでてこず断念)、他に方法はないかと調べたりして、色々格闘すること数時間。

不意に、nsys-ui.exeというのがあるのを発見。プログラムにもNVIDIA Nsight Systemsというのがあるのを確認。

どうやら、CUDAをインストールしたときに一緒についてくるらしく、プロファイルをGUI表示できる模様。.exeファイルが必要なので、Visual Studioの「CUdaRuntime1.exe」ファイルを用いて確認。これはCUDAをインストールしたときに、入っているサンプルプログラムで、Visual Studioで実行すると「x64\Debug\」に作成されます。

select押すと↓の画面が開かれます。「Command line with arguments」には先ほどのexeファイルを選んで、右の「Start」を押すとプロファイルが実行されます。

 

 

プロファイルが完了すると、↓の画面が開きます。バカみたいに情報がいっぱい出てきて、何が何だかよくわかりません...

とりあえず、画面上半分は時間経過と各プロファイル情報を表し、画面下半分は「Stats System View」からサマリーを出せるようです。

 

 

プロファイル(画面上半分)

プロファイルのところで注目するのは、「CUDA API」のようです。今回は、プロファイルの中のCUdaRuntime1.exe→Threads→CUDA APIというところに時間に対応した各関数(addKernelやcudaDeviceReset等)の実行時間が表示されています。これを見ることで、プログラムのカーネルと各プロファイルの対応がとれそうです。

 

 

サマリー(画面下半分)

サマリーでは、グリッド数やブロック数が可視化されます。

例えば、CUDAをインストールしたときにできてるサンプルコードでは、arraySize=5の計算を行っていました。「CUDA GPU Kernel/Grid/Block Summary」を見ると、グリッドのサイズもx方向が5になっています。他の項目では関数の実行時間なんかも表示されているので、これを使えば最低限の解析ができそうです。

 


ただこれ、ソートがどこにあるのかわかりません。もしもソートがないなら、毎回マウス動かしてCUDA APIを探さなきゃいけないのは面倒ですね...

不要な情報は非表示にしたり、分岐効率を調べたりしたいんですが、なかなかに見つけるの大変そうです...

やはり、Jetson Orin Nano Super(約4万)を買ったほうがお手軽か...?