2008-12-01から1ヶ月間の記事一覧

Cuckoo hashingによる多相インラインキャッシュの実験

追記 2008/12/31http://lambda-the-ultimate.org/node/2259 PICについて面白そうな議論がありました。IOはメソッドルックアップにCuckoo hashingを使っているが、継承木を辿るため継承木のオブジェクト数に対して線形時間かかるようです。yarv2llvmでは継承…

yarv2llvmが使いやすくなります、でもバグは取れていません

yarv2llvmにメソッドの外もコンパイルして実行できるようにしました。この結果、 ruby19 yarv2llvm.rb hogehoge.rbなんて感じで、hogehoge.rbをコンパイルして実行できます。これで、あたかもruby yarv2llvm.rbという名前のrubyの処理系があるかのように使え…

ブロックのインライン化を作ってみました

nbodyを速くしたいなと思い、ブロックをインライン化できるようにしてみました。 yarv2llvmではブロックは別関数にコンパイルし、yieldのタイミングで、呼び出しもとのローカル変数のフレームへのポインタを引数に渡して関数呼び出しをするようにしています…

そういえば移植性を全然考えていなかった

llvmrubyで大域変数を実現するパッチをTom Bagbyさんにpullリクエストしたら、これまで書いたパッチを全部取り込んでくれました。すごくありがたいです。でも、問題出ないかちょっと心配です。それどころか、yarv2llvmをfolkしてくれました。64bitでは動かな…

Profilerの実験

とりあえず、こんな感じでProfilerを作ってみました。掛かったクロック数を行毎に表示します。ソースコード兼出力結果です。yarv2llvmで実行するのはただのfibなので、そこだけクロック数が表示されています。後は、Profilerそのもののプログラムです。 以下…

Profilerを作っています

Profilerを作っています。Quantifyみたいなのがいいなって考えています(http://bmrc.berkeley.edu/purify/docs/html/installing_and_gettingstarted/4-quantify.html)。Quantifyのすごいのはサンプリングではなく、プログラム中に計測コードを埋め込んでクロ…

binary_treesはくわせもの

ふと、MagLevとyarv2llvmはどっちが速いんだろう?って思い調べてみました。http://antoniocangiano.com/tag/maglev/に、MagLevのbinary_treesの実行速度がRuby 1.8.6の結果とともに載っているのでこれと比べればいいやと考えました。 結果は、MagLevはRuby1…

変数のフックも考えています

trace_funcの実装がうまく行ったので、調子に乗って変数のアクセス時にもフックができるようにしようと考えています。 例えば、こんな感じになります。 module YARV2LLVM # ローカル変数とダイナミック変数の書き込み時に呼ばれる def local_var_write_func(…

trace_funcを実装しました

yarv2llvmをスピードアップするにはprofilerがいるなーと思い、set_trace_func相当のものを作りました。set_trace_funcのそのままだとtrace_funcが設定されているかどうかを静的にチェックするのが面倒そうなので、YARV2LLVM#trace_funcというメソッドがあれ…

アドバイスを思い出した

昔、学生のとき(15年くらい前)コンパイラを作っていたのですが、コンパイラがちっとも速くならなくて悩んでいたら、 「コンパイラはできることを全部やらないと速くならないよ」 ってアドバイスをもらったことを今日思い出しました。そのときは結局サボった…

nbodyが動きました

yarv2llvmでnbodyが動きました。まだ、attr_accessorとかサポートしていないので、プログラムに手を加えています。 sample/bm_so_nbody.rbがソースです。(http://github.com/miura1729/yarv2llvm/tree/master/sample/bm_so_nbody.rb)実行速度を測ってみまし…

型推論の問題点

yarv2llvmでちょっとまとまったプログラムを動かしてみようと思い、bm_so_nbody.rb(http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/benchmark/bm_so_nbody.rb?revision=13548&view=markup)を動かそうとしています。 まだ、Rangeオブジェクトをサポート…

yarv2llvmでのduck typingの続き

クラスのアドレスから配列のインデックスを求めるメソッドを生成するプログラムを作ってみました。 こんな感じのメソッドを作ることができます。 def klass2idx(klass) add = ((klass.__id__ >> 1) << 2) add = add - 268622760 functab = [:io, :array, :fi…

yarv2llvmでduck typingが出来るような気がしてきたメモ

yarv2llvmではポリモフィズムはやらないとずーっといっているわけですが、Inline cachingはやらなくても効率よくduck typingが出来るような気がしてきたのでブランチを切って試してみようかなと思っています。 まだ、曖昧でただの興味本位なんですがこんな方…

木を見える化してみた

shinhさんの「木ぽいののループ検出」(http://shinh.skr.jp/m/?date=20081202#p01)の木の構造をgraphvizで表示させてみました。(gen-tree 2)の場合です。2の場合でこんなに複雑だと、木そのものが指数関数的に増えているような気がします。共有されていると…