Haskell beats C

2012年に PLDI 2013 に投稿され惜しくも reject されてしまった "Haskell beats C" とその実装の紹介です。(その後、ICFP 2013 に再投稿されました。)
4

経緯

GHC、vector、DPH の SIMD 対応始まる

reddit_haskell @reddit_haskell

New project to support SIMD vector instructions in GHC (x86 SSE & AVX, ARM's NEON etc) http://t.co/7q7vBf2g

2011-11-14 21:50:53

これらの開発は HEAD ではなく simd という branch を使って行われました。

GHC HEAD に SIMD 対応が入る

shelarcy(しぇらーしぃ) @shelarcy

GHC HEAD に、simd branch で行われていた「SIMD 命令を使ったベクトル演算用の primitive を追加する」変更が入りました。 http://t.co/fCfUdk7A

2013-02-02 09:22:50
shelarcy(しぇらーしぃ) @shelarcy

ghc-commits に自動投稿されたメールの表示が一部「master:」ではなく「:」になってますが、無事 review した全ての変更が入っているようです。 https://t.co/vF12IxMu

2013-02-02 09:26:23
shelarcy(しぇらーしぃ) @shelarcy

現時点の実装では「SIMD 命令を使ったベクトル演算用の primitive」は LLVM バックエンドでのみ SIMD 命令にコンパイルされます。native code-generator などではコンパイルエラーになります。 https://t.co/SGKDb6vz

2013-02-02 09:26:50
shelarcy(しぇらーしぃ) @shelarcy

LLVM や LLVM バックエンドには他に Win32/Win64 固有の問題もあるので、今後「native code-generator にも対応するか、Win32/Win64 固有の問題が解決される」ことに期待したいですね。

2013-02-02 09:27:44

後で書いていますが、HEAD で SIMD 対応が入ったのは今のところ GHC 本体のみです。primitive、vector、DPH にはまだ入っていません。念のため。

GHC 及び primitive、vector、DPH の SIMD 対応について書いた論文が紹介される

「SIMD 対応を HEAD に入れるための最終的なレビューを求めるメール [http://www.haskell.org/pipermail/ghc-devs/2013-January/000229.html ]」から始まったスレッドの中で紹介されました。 http://www.haskell.org/pipermail/ghc-devs/2013-February/000270.html

で、SIMD 対応については前々から気になっていたので読んでみたという感じです。

内容紹介

shelarcy(しぇらーしぃ) @shelarcy

(チャンク単位での処理やベクトル演算を扱えるよう)一般化した Stream Fusion を使って、Haskell で C に勝つ! http://t.co/SxVe3ohT

2013-02-05 15:38:23

このつぶやきのリンク先には、2013年3月現在、PLDI に投稿された古いバージョンしか置いてありません。ICFP に投稿された最新版の論文の草稿を読みたい方は以下の URL からダウンロードして下さい。 http://research.microsoft.com/en-us/um/people/simonpj/papers/ndp/

この論文では GHC の SIMD 対応そのものよりも、vector の改良が話のメインです。GHC のベクトル演算用の primitive をそのまま使ったコード (e.g. https://gist.github.com/NicolasT/4974223 ) はでてきません。

shelarcy(しぇらーしぃ) @shelarcy

(Monadic) Stream Fusion の「vector の HEAD や simd branch に入っているチャンク単位で処理を行うための拡張や、simd branch に入っているベクトル演算を行うためのの拡張」について説明する論文ですね。

2013-02-05 15:39:01

チャンク単位の処理のために入ったのが Bundle、ベクトル演算のために入ったのが(後で出てくる) MultiStream です。

shelarcy(しぇらーしぃ) @shelarcy

ちなみに vector HEAD では、Monadic Stream Fusion 上にチャンク単位で処理を行うための Bundle というものが実装されています。(Stream 内部に実装されていた Facets から外部に実装される Bundle に変わりました。)

2012-11-04 23:14:54