2010-01-23

gcclink time optimization

gcc-4.5 から link time optimization (lto) と呼ばれる最適化が可能になった。

従来の分割コンパイルでは、コンパイル単位(ファイル)での最適化しかできなかった。例えば、別ファイル関数をインライン展開することはできないし、引数に渡されたポインタの escape analysis も諦めざるを得なかった。

lto はコンパイルする時に、中間表現(GIMPLEのバイトコード表現)をオブジェクトファイルに残しておき、リンクするときに、すべての中間表現を使って最適化しなおす。要は、ソースコードを全部とっておいて、最後に全部をコンパイルしなおすのと、同じようなものだ。

最大の欠点は、最後にコンパイルしなおすところだ。
このコンパイルは一回のコンパイルであり、単一プロセスで実装されているのでマルチCPUを生かせない。(いっぽう、分割コンパイルなら依存関係が緩いので並列化しやすい。)また、プログラム全体は巨大であり、最適化するのに時間がかかる。

使いかたは簡単だ。-fltoを付ければいい。

gcc-4.5 -c -O2 -flto foo.c

gcc-4.5 -c -O2 -flto bar.c

gcc-4.5 -o myprog -flto -O2 foo.o bar.o

記事への反応(ブックマークコメント)

ログイン ユーザー登録
ようこそ ゲスト さん