GCCの内部データ構造最適化
GCC4.3以降にはstruct-reorgが取り込まれているため、特殊な条件下で内部データ構造を最適化することができる。
構造体の最適化を行うためには、以下の条件をクリアしなければならない。
- プログラム全体を一度にコンパイルする(-fwhole-program --combineを付け、ソースコード全てを一度のGCCパスで処理し、実行ファイルを得る)
- いくつかのオプションをつける - -fipa-struct-reorg、-fipa-type-escape
- (一旦実行プロファイルを取る)
実行プロファイル無しでもstruct-reorgは行えるが、この最適化は構造体のアクセスパタンに依存するので可能な限りプロファイルを提供できるようにパスをデザインするのが望ましい。
ちなみに同様の最適化として-fipa-matrix-reorgが有り、これは行列を展開/転置するなどしてループの性質を改善する。
これらの最適化は、SPECでは良く見えても、現実のアプリケーションでは効果を出しづらい。理由はいくつか有るが、既に人間がホットスポットに対してこの最適化を"手動で"適用しているケースが多いことと、既存の大規模なコードベースはリンク時最適化のために準備されていないのでなかなか実証されづらい点の2つが大きいように思える。
端的に言えば、大抵のアプリケーションにおいては構造体のレイアウトはボトルネック要因ではない。インテリジェントなキャッシュはこれらのオーバヘッドをよく隠蔽することができる。もっとも、非常に大きなツリー構造を作るような特殊なケースにおいては役に立つ可能性が有るかもしれない。