2004-01-14 [長年日記]
λ. YARV + Ruby/TCC
YARVの出力したバイトコードを、実行時にC言語に落としてRuby/TCCでコンパイルしてみる(そのためのパッチ)。でも、そしたらかえって遅くなってしまった (T_T)
青木さんの「これを使ってJITコンパイラ作れるかな」というツッコミを見てから、実行時にrb_eval()を部分計算してRuby/TCCでコンパイルというのをずっと考えてたのだけど、rb_eval()がでか過ぎてこれは挫折してたのでした。YARVはまだ小さいので簡単に試せて楽しかった。
λ. 読書
- 『進め!聖学電脳研究部』
- 平野 耕太 [著]
んーと、そのために命令と独立にしてるんで、結構いけそうな気がしなくも無いが。(しかし、いきなり大技だ)
tccではなくgccを使ったら、ちゃんと速くなりました (^^;<br>どうやら、遅くなってしまっていた原因は、コンパイラの違いにあったようです。<br><br>……というわけで、デフォルトではRubyをコンパイルしたコンパイラを使うようにしてみました。<br>http://www.tom.sfc.keio.ac.jp/~sakai/d/data/200401/yarv000c-jit.diff
- 速くなったのはどれくらい?<br>- スタック操作、どうやってんのかよくわかんないんだけど<br>- 変換後のソースぷりーずー
> - 速くなったのはどれくらい?<br><br>実行時間(コンパイル時間を除く)を見ると、大体20%くらい速くなってます。<br><br>fib(32)<br>------------------<br>ruby 14.020000<br>yarv 8.782000<br>yarv+gcc 7.240000<br><br>tak(24,16,8)<br>------------------<br>ruby 4.586000<br>yarv 2.594000<br>yarv+gcc 2.063000<br><br>> - スタック操作、どうやってんのかよくわかんないんだけど<br><br>sendのとこですか?<br><br>元々のコードだと goto first; しているため、footerの PUSH(val) は実行されていなかったのですが、私のコードだと goto first; しなくなっているので、PUSH(val) が実行されてしまい、そのままだとスタックがずれてしまします。<br><br>そこで、PUSH(val)を相殺するためにあらかじめ<br>val = TOPN(0);<br>POPN(1);<br>してます。<br><br>> - 変換後のソースぷりーずー<br><br>後でアップロードしときます。
ああ、なんてこった。PUSH は insns2vm.rb で加えちゃってんのか(もう覚えていない)。だめだこりゃ。<br><br>要するに、命令ディスパッチのコストはがんばっても2割ほどしか速くなんねーってことですね。<br><br>それはそれで、非常に有意義な結果ですね。感謝。<br><br>スタック操作を消せば、倍にはなりそうだな。
> スタック操作を消せば、倍にはなりそうだな。<br><br>そうですね。私も本当はそこまでやりたかったのですが、学期末で時間がないのでした (T_T)<br><br>それと、あれからちょっと変更したので、パッチを新しくしました。<br>http://www.tom.sfc.keio.ac.jp/~sakai/d/data/200401/yarv000c-jit2.diff <br><br>あと変換後のソースの例です。<br>http://www.tom.sfc.keio.ac.jp/~sakai/d/data/200401/yarv000c-jit2-fib.c<br>以下のプログラムを実行したときに内部で生成されているものです。<br><br>----<br>require 'yarvcore'<br>require 'yarvjit'<br><br>prog =<<EOS<br>def fib(n)<br> if n < 2 then<br> 1<br> else<br> fib(n-2) + fib(n-1)<br> end<br>end<br>fib(32)<br>EOS<br><br>bs = YARVCore.parse(prog)<br>YARVJIT.compile_all<br><br>vm = YARVCore::VM.new<br>vm.eval(bs)
100倍になりますた.
さっすがぁ!<br><br>P.S.<br>今度のRHG読書会の時にでもYARVの事を色々と訊こうと思ってたのですが、私はちょっと都合が悪くなってしまい今回は参加できそうにないのでした。残念無念なり〜 (T_T)
なんてこった.私も色々と聞こうと思ってたのに.sfc まで行こうかなぁ(何しに).