紹介

随分前から注目していた 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-cudadependencies から外して Data.Array.Accelerate.Interpreter (CUDAなしで計算をエミュレートするモード) を使い ghc-mod でのコーディングに使う
  • stack : accelerate-cudadependencies に追加して Data.Array.Accelerate.CUDA (CUDAで計算するモード) を使い端末から動作やテストするときに使う

追記

もう少し Haskell や CUDA 関係のノウハウがたまったら、次回以降は Wiki 的なものにそれなりに体系だててメモしたいなと思います。そろそろこのブログ形式も見難くなってきました。汗