GPGPUをもふもふする会/サンプルコード

Last-modified: 2009-12-28 (月) 14:50:34

GPGPUをもふもふする会で使ったサンプルコードの解説です。
いずれも、コンパイル&実行するにはCUDA環境に加えてthrust http://code.google.com/p/thrust/ が必要です。

filemofumofu.zip

解説

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]