ひきぷろのプログラミング日記

プログラミングの日記です。

C#からCUDAを書けるようにしてみた

こないだ CUDA Toolkit 7.5 をダウンロードしてみたんですが、C# から呼び出すためのライブラリが最新版に対応してなさそうだったので、試しに自分で作ってみました。(ちゃんと調べていないだけで、対応しているかもです。)

github.com

CUDAnshita (くだんした) っていう名前です。
「CUDA」 が入ってて、他の人にまだ使われてなさそうだったのが、それしか思い浮かびませんでした。検索しやすさ的には良いかなと思っています。
(ほんとは BarraCUDA にしようと思ってたんですが、すでに使われているようでした。)

使い方は GitHub の README.md を読んで頂ければ分かると思います。
実行する時に、もしかしたら CUDA Toolkit 7.5 をインストールする必要があるかもしれません。

使い方

拡張子 cu の CUDA のコードを書いて、 NVRTC.Program クラスのオブジェクトに渡すと実行時にコンパイルできます。
コンパイルできたら、 Module というオブジェクトに渡すと GPU で動く関数を呼び出すことができます。

CUDA で使用するメモリは、あらかじめメインメモリ上に準備しておいて、グラフィックカード上に転送して使用します。
GPU 上で動く関数の呼び出し後に、またグラフィックカードからメインメモリに結果を転送してきて、 CPU で結果を見るような感じで動かします。

雑感

第9回 プログラミング演習 ~基礎編②~ | G-DEP

こちらで紹介されているプログラムをそのまま C# で動かしてみたら、手元の環境では実行時間が 1/20 くらいになりました。やはり並列化で高速化できるプログラムだと速いです。

数カ月前に Unity の Compute Shader で GPGPU をやろうとした時は色々困難を感じてしまいましたが、 CUDA だとわりとすんなり書けてしまえそうな感じで、今のところの印象はとても良いです。

CUDA Toolkit 7.5 は、 Visual Studio 2013 だと開発環境との相性が良さそうです。 2015 から使おうとすると、何か追加でインストールしないといけないかもです。

まだ試していないですが、 .NET Framework 2.0 でも動かせるように書いているので、 Unity から使うこともできるかもしれません。

CUDA Toolkit では OpenGLDirectX とシームレスにデータをやりとりできるような機能があるそうですが、 CUDAnshita ではまだ実行できません。

何かフィードバックを頂ければやる気が上がるかもです。興味のある人はさわってみて頂けると嬉しいです。

追記

CUDA Toolkit に付属している Visual Profiler の出来が良いので、最適化もやりやすそうです。 Chrome の Inspector みたいな感じで GPU の実行時間を見ることができます。
現状 GitHub に置いている CUDAnshita をベースに作ったプログラムの結果を Visual Profiler で見ようとすると、少しいじらないといけないですが。。
cudaProfilerStart() の呼び出し後から、 cudaProfilerStop() を呼び出すまでの間を Profiler で確認できるみたいです。

参考リンク:
CUDA Runtime API :: CUDA Toolkit Documentation

追記2

既存のライブラリのリンクを貼っておきます。
せっかく覚えるのであれば、こちらに慣れた方が良いです。

github.com

cudafy.codeplex.com