コンパイラ最適化とは、
コンパイラがプログラムの性能を向上させるために行う様々な処理のことです。主な目的は、プログラムの実行時間を短縮すること、使用するメモリ量を削減すること、消費電力を最小化することです。ただし、すべての最適化が常に有効というわけではなく、場合によっては逆効果になることもあります。そのため、
コンパイラは様々な最適化技術を組み合わせ、対象となるプログラムや環境に合わせて最適なコードを生成するように設計されています。
最適化の種類
最適化は、適用される対象によって大きく二つに分類できます。
高水準最適化:ソースコードに近い中間言語に対して行われる最適化です。例えば、ループの最適化や、冗長な計算の削除などが含まれます。
低水準最適化:
機械語に近い
中間言語に対して行われる最適化です。例えば、レジスタの割り当てや、命令スケジューリングなどが含まれます。
また、最適化の対象範囲(スコープ)によっても分類できます。
のぞき穴最適化:ごく一部の命令列を対象に行われる局所的な最適化です。
ループ最適化:ループ処理を対象に行われる最適化です。
局所最適化/手続き内最適化:一つの関数または手続き内を対象に行われる最適化です。
プロシージャ間最適化/プログラム全体の最適化:プログラム全体を対象に行われる最適化です。
さらに、最適化は
プログラミング言語への依存性、マシンへの依存性によっても分類されます。
プログラミング言語非依存の最適化:多くのプログラミング言語で共通して適用できる最適化です。
プログラミング言語依存の最適化:特定の
プログラミング言語の特性を活かした最適化です。
マシン非依存の最適化:特定のハードウェアに依存しない最適化です。
マシン依存の最適化:特定のハードウェアの特性を考慮した最適化です。
最適化に影響する要因
コンパイラが適用する最適化は、様々な要因によって影響を受けます。
対象マシン:CPUのアーキテクチャ、レジスタ数、パイプライン構成、キャッシュメモリの構成などが最適化の方針に影響します。
生成されたコードの用途:
デバッグ用、汎用目的、特殊目的など、用途によって最適化の優先度が変わります。
各種最適化
コンパイラは、様々な最適化技術を組み合わせてプログラムの性能を向上させます。以下に代表的な最適化技術を紹介します。
ループ最適化
ループ処理を効率化するための最適化です。帰納変数解析、ループ分裂、ループ融合、ループ転置、ループ交換、ループ不変量コード移動、ループ展開などがあります。
データフロー最適化
プログラム中のデータの流れを解析し、最適化を行う手法です。共通式削除、定数畳み込み、定数伝播、帰納変数の認識と除去、エイリアス分類とポインタ解析などがあります。
静的単一代入形(SSA)ベースの最適化
プログラムを静的単一代入形式(SSA)に変換した上で最適化を行う手法です。大域値番号付け、疎な条件分岐を考慮した定数伝播などがあります。
コード生成での最適化
機械語レベルで効率的なコードを生成するための最適化です。レジスタ割り当て、命令選択、命令スケジューリング、再実体化、計算の再配置、
CPU固有命令の使用などがあります。
関数型言語での最適化
関数型言語の特性を活かした最適化です。再帰呼び出し除去、
データ構造融合、
ラムダ計算からコンビネータ論理への変換などがあります。
その他の最適化
境界検査除去、分岐オフセット最適化、ブロック再配置、デッドコード削除、不変式のくくり出し、分岐スレッディング、演算子強度低減、キャッシュ上の衝突の削減、スタックを使用する深さを削減、条件式の並べ替えなどがあります。
プログラム全体を対象とする最適化で、インライン展開、
プロシージャ間デッドコード削除、
プロシージャ間定数伝播、
プロシージャ再配置などがあります。
最適化におけるプログラムの表現
コンパイラは、最適化処理の内容に応じて様々なプログラム表現を使用します。
抽象構文木、静的単一代入形式(SSA)、3番地コード、制御フローグラフ、擬似命令などがあります。
最適化における問題
コンパイラによる最適化は、必ずしも常に最善の結果が得られるわけではありません。
コンパイラは低レベルの局所的な最適化に偏りがちで、高レベルの非効率さは修正できない場合があります。
コンパイラは様々な要求に対応する必要があるため、個別の最適化に特化できません。
コンパイラはプログラム全体のごく一部しか見ないため、文脈的な情報を十分に活用できない場合があります。
高度な最適化には時間とメモリが必要となるため、どこまで最適化するかというトレードオフが存在します。
最適化の各フェーズ間の相互作用を考慮する必要があります。
結論
コンパイラ最適化は、ソフトウェアの性能を向上させる上で非常に重要な役割を担っています。コンパイラは様々な最適化技術を駆使し、対象となるプログラムやハードウェアに合わせて最適なコードを生成するように設計されています。ただし、最適化には限界があり、常に最善の結果が得られるわけではありません。そのため、プログラマはコンパイラの最適化だけに頼るのではなく、アルゴリズムの選択やデータ構造の設計など、より高レベルな最適化も意識する必要があります。
関連項目
最適化関数
インライン展開
ループ展開
外部リンク
NULLSTONE Optimization Categories
GCC optimizations
Optimization manuals by Agner Fog
Assembly Optimization Tips by Mark Larson
* Citations from CiteSeer