はじめての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++版と同じ出力をすることを確かめました。