タイトルまんまです。
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
で無事にバージョンが表示されることを確認。
Windows・Linux問わず、これが表示されると、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万)を買ったほうがお手軽か...?

