Gauche:VMの最適化:Flonumの扱い
Flonumの扱い
動的型で、コンパイルにあまり時間をかけられないスクリプトエンジンで どうしても不利になるのが、浮動小数点数の扱いだ。 タグ付きのdoubleは1マシンワードに収まらない。 全てのオブジェクトを1ワードのハンドルで扱おうとすると、 浮動小数点数をヒープアロケートして、そのアドレスを持つという形になる。 しかし、実数計算がintensiveなプログラムでは膨大な中間結果が 作られてはすぐ捨てられるので、そのたびにいちいちヒープアロケート するのはとてもしんどい。
ScmFlonumをヘッダ無しにする
0.8.8までは、浮動小数点数 (ScmFlonum) は他のheap allocatedな Schemeオブジェクトと同様、オブジェクトヘッダ + データ (double) という構造になっていた。
struct ScmFlonumRec { SCM_HEADER; double value; };
32bitアーキテクチャでも多分アラインメントのためのpaddingが入るので、 これは4ワード消費する。
ScmFlonumを指すポインタの方にタグをつければ、アロケートされたScmFlonum の実体にヘッダはいらない。アロケーションの回数は変わらなくても、 中間結果が大量に作られる計算の場合、GCの回数が減らせる (また、実体がdoubleだけならATOMICでアロケートできるので、 GCのmark phaseでたどるポインタも減らせる) ことが期待される。
ベンチマーク。
ヘッダ有り | ヘッダ無し | |
compplot | 12.83 | 11.57 |
rgs | 7.74 | 7.80 |
ssax | 10.96 | 10.91 |
ack | 4.44 | 4.58 |
tak | 30.66 | 30.84 |
んー微妙。浮動小数点数演算を多用してるcompplotではかなりはっきり差が 出るんだけど、あとは誤差範囲だなあ。rgsもけっこう浮動小数点数演算を 使ってるはずなんだが。
まあ、この変更は次のテストの伏線なので、性能低下が無ければよしとする。
Fast flonum extension
この項しばらくアップデートしてなかった。
上のは、中間結果で生成されるflonumのアロケートを抑える最適化の ための前フリ。で、実際にアロケートを抑える最適化を入れてみた 話はまとめてPPL2008に出した。
http://www.nue.riec.tohoku.ac.jp/ppl2008/program.html
実数演算をたくさんやるプログラムの場合、中間結果としてのflonumが 大量に生成されるんだけど、そのほとんどはGC_MALLOCしないで済むという ことがわかった。
実装はexperiment_ffxというブランチにて。 (2008/04/12 14:55:26 PDT)
最終的に、0.9に向けたsvn trunkにて統合。