Haskell Accelerate で CUDA プログラミング (紹介と導入)
紹介
随分前から注目していた Accelerate というライブラリ、なんと Haskell 中の EDSL --- Python でいう Copperhead みたいな本物の Haskell --- で CUDA プログラミングが可能という代物です。
なんといってもトップページにある以下のベクトル内積を算出する極めてシンプルなコード
dotp :: Acc (Vector Float) -> Acc (Vector Float) -> Acc (Scalar Float)
dotp xs ys = fold (+) 0 (zipWith (*) xs ys)
これが CUBLAS に匹敵する性能を叩き出すという話です。。 C++ の STL アルゴリズムを実装した thrust などでも CUBLAS を使うほうが速い のが通説ですが、これはにわかには信じられない...。
導入
結局ベンチマークは CUBLAS の FFI ライブラリがまだ動かせてないので試してないんですが、簡単なサンプルだけ動かしてみました。
ShigekiKarita/first-accelerate
動かすときに詰まったのは、 accelerate-cuda
がインラインの C コード で {
の次にかかれた/* コメント */
がパースに失敗してコケる点でした。そこで最新版HEADにコメント部分を削除しただけのパッチを当てました。ビルドツールに stack を使ってる場合は
packages:
- location:
git : git@github.com:ShigekiKarita/accelerate-cuda.git
commit : 648e683d191d0c402c217174d44f85650cbf3f66
- location:
git : git@github.com:AccelerateHS/accelerate.git
commit : 15aedff344232893c89e513c1caf4bcf699a2b86
と指定してあげるとちゃんと動くと思います。 stack じゃなくて cabal 使う人は DL したフォルダを cabal sandbox add-source DLしたフォルダ
で cabal sandbox に教えると使ってくれます。
開発環境
ghc-mod は cabal と連携して Emacs やその他エディタを IDE にしてくれる Haskell 開発にはかかせないツールですが、いまのところ stack や CUDA とは動作しません。なので私は次のように stack と cabal を使い分けています
- cabal :
accelerate-cuda
をdependencies
から外してData.Array.Accelerate.Interpreter
(CUDAなしで計算をエミュレートするモード) を使い ghc-mod でのコーディングに使う - stack :
accelerate-cuda
をdependencies
に追加してData.Array.Accelerate.CUDA
(CUDAで計算するモード) を使い端末から動作やテストするときに使う
追記
もう少し Haskell や CUDA 関係のノウハウがたまったら、次回以降は Wiki 的なものにそれなりに体系だててメモしたいなと思います。そろそろこのブログ形式も見難くなってきました。汗