2023-07-23
GPUを使う前に、CPUを使い切るべくマルチコア版DFTを実装。いよいよ、CUDA Cでの実験。なんとサクッと300倍。MacBookのCPU、M1 Proが3.2GHz6コア(21G)、対するGPU、RTX 3060Tiが1.6GB4864コア(7782G)なので、周波数*コア比で370倍。ほぼスペック通りの性能です。


CUDA Cでのカーネル呼び出し、スレッド数をいろいろと変えて実行時間を測ってみた結果です。最大の1024から半分にしながらループ、同じ命令をまとめて実行するグループ、ワープの数32までは4秒と最速。その後、スペック通り、数に応じて遅くなりました。


リソースモニターでの表示。GPU負荷はリアルタイムに分かるわけではないのかも?


「DFT DataViewer」

44.1kHz、130万サンプル、32秒の楽曲「世界で一番熱い町さばえ」まるごと、わずか4秒でDFTできちゃいました。いじって逆変換したり、いろいろ遊べそうです。M1マルチコア版だと20分、JavaScriptなら5時間、300倍の差は大きい!

動かし方(要、CUDA対応NVIIDA製GPU)
1. 「code4fukui/DFT on GitHub」をクローン
2. c-cuda.bat でコンパイル(要、Visual C++コンパイラ、CUDA Toolkitをインストール)
3. a.exe を実行

こちら、コンパイルコマンド c-cuda.bat

nvcc -D_USE_MATH_DEFINES -Xcompiler "/wd 4819" -use_fast_math dft_cuda.cu

CUDA Cのコンパイラ、nvcc
-D_USE_MATH_DEFINES で、M_PIなど数学定数を使用可能に
-Xcompiler "/wd 4819" で、コンパイル時の警告を抑制
-use_fast_math で、高速数学関数を使用(通常関数の約10倍速!)


「CUDA C++ Programming Guide」

公式ドキュメントも豊富でうれしい!

NVIDIA RTX 3060Tiには、128コア、4ワープ載った、Streaming Multiprocessor(SM)が38コ。SMがブロックに対応してガンガン処理してくれます。

JavaScript/Deno(M1) → シングルコアのC言語(M1)、たった3倍。
JavaScript/Deno(M1) → CUDA C言語(RTX3060Ti)で、4500倍。
シングルコアのC言語(M1) → CUDA C言語(RTX3060Ti)で、900倍。

3倍程度の速度差ではいまいち使う気にならないかもしれませんが、4500倍だと話が変わってきますね。

更に、最新のRTX 4090を使うと、2.52GHZx16384コア(41287G)と、RTX 3060Ti(7782G)の更に5.3倍、なんとJavaScript/Denoの2万倍速で処理できそう。

現代コンピューターをフル活用したい?
Let's CUDA C言語!

Tweet
クリエイティブ・コモンズ・ライセンス
本ブログの記事や写真は「Creative Commons — CC BY 4.0」の下に提供します。記事内で紹介するプログラムや作品は、それぞれに記載されたライセンスを参照ください。
CC BY / @taisukef / アイコン画像 / プロフィール画像 / 「一日一創」画像 / RSS