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言語!