Gauche:VMの最適化:Flonumの扱い

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にて統合。

More ...