2011-02-01

Clozure CLの最適化について

書きかけ:多分、加筆・訂正します。

Clozure CLは、生成するコードの最適化を、ポリシーオブジェクトというものを使って管理している。対話的なコンパイルに使われるものや、compile-fileに使われるものなど、複数のポリシーオブジェクトが存在するが、デフォルトでは全てのポリシーオブジェクトは同じ設定になっている。

ポリシーオブジェクトは構造体のようなもので、それぞれのスロットには関数が収納されている。関数は、一部の例外を除き、レキシカルな環境を引数として受け取る。イメージとしては、

#'(lambda (env)
    (< (debug-optimize-quantity env) 2))

こんな感じ。コンパイラは、これらの関数が返す真偽値を元にして、最適化を行う。つまり、ポリシーオブジェクトのスロットの数の分だけ、最適化のオプションがある。

具体的な内容は以下の通り。1.6の時点での情報。項目の名前は、ポリシーオブジェクトのスロットにアクセスするマクロの名前で、動作はデフォルトのもの。

policy.allow-tail-recursion-elimination
末尾再帰の最適化をするかどうか。debugが2未満のときに真。
policy.inhibit-register-allocation
詳細不明。debugが3のときに真。
policy.inhibit-event-checking
現状では何にも影響しない。このオプションが存在しないブランチもある。
policy.inline-self-calls
詳細不明。debugが3未満のときに真。
policy.allow-transforms
コンパイラマクロを展開するかどうか。safety、compilation-speed、debugが3未満で、speedが1以上のときに真。
policy.force-boundp-checks
詳細不明。safetyが3のときに真。
policy.allow-constant-substitution
詳細不明。つねに真。
policy.open-code-inline
極端に長いインストラクションをインライン展開するかどうか。speedがspaceより大きいとき真。コストの高いスペシャル変数の参照などがインライン展開される。
policy.inhibit-safety-checking
引数の数、型、束縛の有無などのチェックを省くかどうか。speedが3で、safetyが0のとき真。型のミスマッチがクラッシュを引き起こす可能性がある。
policy.trust-declarations
型宣言が利用されるかどうか。safetyが3未満で、speedがsafety以上のとき真。固定長整数同士の演算では型チェックが省かれ、リストへの操作は安全でないコードが生成される。それ以外の型では型特有のコードが生成されるが、policy.inhibit-safety-checkingが真でなければ、安全なコードが生成される。
policy.declarations-typecheck
型宣言が実行時に行われるかどうか。safetyが3か、speedがsafety未満のとき真。theを実行時の型チェックのコードにコンパイルし、束縛や破壊的変更の際に型チェックを行うコードが挿入される。

以下参考文献。

0 件のコメント: