はじめてのGPUプログラミング

それでは、いよいよGPUプログラミングをやってみましょう。C++コードの生成器CUDA用のもの.に書き換えるのは、実際すごく簡単です。

$ diff HelloWorld/Generator.hs HelloGPU/Generator.hs
40c40,42
<   { Native.directory = "./dist/"
---
>   { Native.directory = "./dist/" ,
>     Native.language  = Native.CUDA,
>     Native.cudaGridSize = (32,1)

このように、ネイティブコード生成の詳細を指定するSetup型の値において、CUDAコードを生成したいということと、CUDAのグリッドサイズを指定するだけです。(以下の指定の場合、すべてのCUDAカーネルは<<<32,1>>>のサイズをもって起動されます。現在のParaisoにはカーネルごとにグリッドサイズを変える機能はありません。)

mySetup :: Native.Setup Vec2 Int
mySetup =
  (Native.defaultSetup $ Vec :~ 10 :~ 20)
  { Native.directory = "./dist/" ,
    Native.language  = Native.CUDA,
    Native.cudaGridSize = (32,1)
  }

生成されたコードは東京工業大学のTSUBAME2.0で、nvcc4.1(と内臓されたthrust)を用いて、C++版と同じ出力をすることを確かめました。