GPGPUをもふもふする会で使ったサンプルコードの解説です。
いずれも、コンパイル&実行するにはCUDA環境に加えてthrust http://code.google.com/p/thrust/ が必要です。
解説
step01: 0..499までの自然数の平方根を求めよう!
まずはCUDAの基本、CUDA Cで並列処理を記述する方法のサンプルです。
従来Fortran, C, C++などの手続き型言語では、配列など大規模なデータを操作する場合、
ループにより直列的に処理していましたが、
CUDA Cでは代わりに沢山のスレッドを起動し、同時に動作させることで並列処理を行います。
step02: ローレンツアトラクタをプロットしてみよう!
これは常微分方程式の積分結果を、沢山の初期パラメータについて求めるもので、
独立な多数の問題を解くような課題のサンプルです。
このような課題は、もっとも容易にGPUの性能を引き出すことができます。
step03: ライフゲームをシミュレートしてみよう!
これはライフゲームをシミュレートするサンプルで、データ全体がおたがい関係しているような計算の例です。このような計算は流体計算など、シミュレーション科学で使われる幅広い計算に属する、もっとも簡単なモデルです。
このサンプルではデバイスメモリの読み書きが支配的になるので、GPUの演算性能をフルに引き出すことはできませんが、メモリアクセスパターンが連続的なので、デバイスメモリの帯域幅の恩恵を受けています。
step04: CUDA CのC++部分を活用しよう!
CUDA CはC++のさまざまな機能が使えます。
このサンプルでは、オブジェクト指向、演算子オーバロード、テンプレートプログラミングなど
C++の強力な機能を、CUDAカーネルの中でも使えることや、
同一のコードをホストとデバイス両方で使いまわせることを示します。
このテーマについてさらに詳しく知りたい方は、ぜひthrustのソースを読んでください。
step05: CUDAコードを自動生成しよう!
Haskellキタ━━━(゚∀゚)━━━━ー!!!
このParaisoというシステムは、並列計算のことは全く考えないような、数式を直接書く程度のシンプルなコードから、CPU並列やGPU並列計算向けのコードを自動生成するものです。
Mainなんとか.hs というファイル名のファイルが、ソースコードです。
ghc --make MainLorenz ./MainLorenz ./MainLorenz --cuda
とすると、C++およびCUDA Cでローレンツアトラクタを計算する(step02相当)コードが生成されます。
それのParaisoソースコードは以下のように、微分方程式ほとんどそのままの簡単なコードですが、4次のルンゲクッタ積分をGPUで行うCUDA Cコードが自動生成されます。
code = do parallel 16384 $ do x <- allocate y <- allocate z <- allocate x =$ Rand 10 (20.0::Double) y =$ Rand 10 20 z =$ Rand 10 20 cuda $ do p <- allocate r <- allocate b <- allocate p =$ 10 r =$ 28 b =$ 8/3 integrate4 0.01 (10 * 655.36) $ [ d_dt x $ - p*x + p*y , d_dt y $ - x*z + r*x - y , d_dt z $ x*y - b*z ] output [x,y,z]