LLVM 勉強会第2回の記録

ちょっと遅くなりましたが LLVM 勉強会に参加した記録を残します。

御礼

まずは勉強会を主催してくださった syoyo 様、場所を提供してくださった SGI 様、発表していただいた syoyo 様、miura 様、omo 様、ありがとうございました。
また参加された皆様、懇親会でお話できた皆様、楽しかったです。ありがとうございました。

LLVM powerd JIT Shader Engine (syoyo)

シェーダ言語(などというものがこの世にはあるのですね)RSL を Haskell で書いたコンパイラによって LLVM に落とし高速化するというお話。
わたしに前提知識が無いのでかなり怪しいですが、LLVM がぴったりはまる面白い内容でした。

  • 「フォトリアル」な CG には多くの演算が必要である。「シェーディング」を行う「シェーダ」プログラムは、伝統的に中間スタック言語にコンパイルされインタプリタ実行されてきた。
  • Reyes と Raytracing の二つの手法がある。Reyes では、インタプリタといっても内部的には SIMD を生かせるようになっていたので高速だった。今は Raytracing が重要になってきているが、Raytracing では Reyes と計算手法が異なり SIMD を生かし難い。(※理由もあったが理解しきれず)
  • そこで JIT シェーダが有効になりえる。
  • シェーダ言語 RSL という仕様がある。C っぽい、シェーダのための専用言語。参考: http://ja.wikipedia.org/wiki/シェーディング言語
  • 構成: シェーダ言語 RSL => 自作コンパイラ => LLVM IR => LLVM コンパイラ => LLVM .bc 。さらに自作ライブラリとリンクして JIT 実行
  • Haskell LLVM Binding が存在するが独自に IR を出力(LLVM C++ ヘッダのインクルードなどが不要になるので)。(※男らしい。わたしなら schemeLLVM バインディングがあれば多分それを使うだろうなぁ。また Hakell てのが素敵だ。やっぱりこれからのコンパイラHaskell で書くのが早いのだろうか?)
  • Mandelbort シェーダで 3light(製品??) の10倍の速度が出ている。

yarv2llvm "Real Programmers Don't use Yarv2LLVM" (miura )

現在の Ruby VM (元 yarv) を、 LLVM + 独自の型推論で高速化するというお話。
同じくわたしに Ruby, Yarv の知識が無いのですが、いろいろと勉強になる面白い内容でした。

  • py2llvm と同様の構成。
  • 構成: Ruby -> バイトコード (RubyVM::InstructionsSequence) => yarv2llvm(自作コンパイラ) + llvmruby => LLVM コンパイラ => LLVM .bc
  • 「ネイティブコードにすれば速くなるわけではない」(※そこで型推論。質問したところ LLVM の最適化より型推論部分が速度に効いているとのこと。
  • コンパイラマクロの話を miura さんとささださんと伺おうと思っていたのにわたしがトイレに行っている間に二人だけで楽しく話されていたらしい。あぁ、わたしも聞かせてもらいたかったよ。
  • 型推論はまだ実験的な段階。会場からメソッドの再定義時やライブラリの読み込み時など、境界的な部分に関する突っ込みあり。
  • yarv は既に高度に最適化されていて、超えるためには何らかの妥当な(一部言語仕様への制限とか、あるいは言語仕様の拡張とか)トレードオフが必要、と理解したつもり。
  • yarv2llvm ではスタックベースの VM (yarv) 向けバイトコードLLVM 向けに変換。2パス。
  • RubyVM::InstructionSequence.compile(...).to_a によって命令列とヘッダを得る。
  • ※ 前から "何とか2llvm" は色々可能性があると素朴に思っていて(python, ruby の替わりに gauche を使う gauche2llvm とか。もう誰かやってるかも?)、 LLVM で延々最適化すりゃ速くなるんじゃね?と思っていたのですが、型推論とかまでやらないと無理とすると世の中甘くないのだなぁ。まあそれでも、既存のインタプリタ+VMの処理系は、コンパイル速度と実行速度のバランスを取っていると思うので、コンパイル時間を思いっきり犠牲にして、処理系の豊富なライブラリを生かす、という戦略は意味があるかもなぁと未だ思っていたりします。
  • yarv2llvm の型推論;(※ここらはコードを読まないと説明不可能。時代は型推論なのだろうか。Common Lisp みたく declare で自分で指定するのは今風ではない?)


続く。