2009-03-07
AOベンチの生成コードを見てみた
|AOベンチをyarv2llvmでコンパイルした結果を見てみました。1万行以上になっていてびっくりです。
かなり悲しいコードが生成されていました。
%80 = load i32* %50 ; <i32> [#uses=1] %81 = inttoptr i32 %80 to { { i32, i32 }, double }* ; <{ { i32, i32 }, double }*> [#uses=1] %82 = getelementptr { { i32, i32 }, double }* %81, i64 0, i32 1 ; <double*> [#uses=1] %83 = load double* %82 ; <double> [#uses=1] %84 = call i32 @rb_float_new(double %83) ; <i32> [#uses=1]
わかりづらいですが、%80〜%83まででBOX化されたdoubleデータ(Rubyの内部表現)をUNBOX化してdoubleの生表現を取り出して、%84でその結果をRubyの内部表現にBOX化しています。つまり、結果的には何もしていないのですが、キャッシュを汚し、メモリをとってGCの起動を早めています。
何とか対策したいのですが、実は%80〜%83と%84は別関数でLLVMレベルの最適化の結果でくっついているだけです。なので、yarv2llvmレベルで対策しようとすると、関数間で解析しないといけなくてなかなか面倒です。勉強会までに解決方法が見つかればいいネタになるのですが、見つからなかった場合は見なかったことにしたいと思います 涙)。
追記
コメントを書く
トラックバック - http://d.hatena.ne.jp/miura1729/20090307/1236400689
リンク元
- 42 http://www.javaeye.com/rss/topic
- 19 http://www.rubyist.net/~kazu/samidare/
- 4 http://d.hatena.ne.jp/keywordmobile/LLVM
- 4 http://lucille.atso-net.jp/aobench/
- 3 http://rednaxelafx.javaeye.com/blog/344763
- 3 http://www.google.co.jp/hws/search?hl=ja&q=RFC1213&client=fenrir&adsafe=off&safe=off&lr=lang_ja
- 3 http://www.google.co.jp/search?hl=ja&client=firefox-a&rls=org.mozilla:ja-JP-mac:official&hs=Lpl&q=llvm+ruby&btnG=検索&lr=lang_ja
- 3 http://www.google.co.jp/search?hl=ja&rlz=1B3GGGL_jaJP294US295&q=Ypsilon+scheme&btnG=検索&lr=
- 3 http://www.google.com/search?client=safari&rls=en-us&q=llvmruby&ie=UTF-8&oe=UTF-8
- 3 http://www.google.com/search?hl=ja&lr=lang_ja&ie=UTF-8&oe=UTF-8&q=Ypsilon++scheme&num=50