スポンサーリンク

【応用情報技術者試験】コンパイラ最適化処理

最適化の種類

最適化の方法内容
関数のインライン展開関数を呼び出す箇所に,呼び出される関数のプログラムを展開する。
共通部分式の削除同じ式が複数の箇所に存在し,それらの式で使用している変数の値が変更されず,式の値が変化しないとき,その式の値を作業用変数に格納する文を追加し,複数の同じ式をその作業用変数で置き換える。
定数の畳込みプログラム中の定数同士の計算式を,その計算結果で置き換える。
定数伝播変数を定数で置き換える。
演算子強度低減高コストな演算を同等の低コストな演算に置き換えることで、プログラムの実行速度を向上させること
無用命令の削除プログラムの実行結果に影響しない文を削除する。
ループ内不変式の移動ループ中で値の変化しない式があるとき,その式をループの外に移動する。
ループのアンローリングループ中の繰返しの処理を展開する。

最適化の効果

関数のインライン展開

  • 実行速度の向上:関数呼び出しに伴うオーバーヘッド(引数の受け渡し、スタックフレームの作成と破棄など)を削減できるため、実行速度が向上します。
  • 最適化の機会増加:インライン展開されたコードに対して、コンパイラはさらなる最適化(定数畳み込み、ループ展開など)を施すことができ、より高いパフォーマンスを引き出す可能性があります。
  • コードサイズの増加:関数の定義が呼び出し元に展開されるため、コードサイズが増加する可能性があります。
  • キャッシュヒット率の向上:小さな関数がインライン展開されることで、キャッシュヒット率が向上し、パフォーマンスが向上する可能性があります。

共通部分式の削除

  • 実行速度の向上:共通部分式を一度だけ計算することで、全体的な計算量を減らし、実行速度を向上させることができます。特に、ループ内で共通部分式が頻繁に現れる場合に効果的です。
  • コードサイズの削減:一時変数を使用することで、同じ計算を繰り返すコードを削減し、コードサイズを小さくすることができます。
  • 消費電力の削減:計算回数を減らすことで、消費電力を削減する効果も期待できます。

定数の畳込み

  • 実行速度の向上:実行時に計算する必要がなくなるため、プログラムの実行速度が向上します。
  • コードサイズの削減:計算結果が直接コードに埋め込まれるため、コードサイズが削減される場合があります。
  • 可読性の向上:定数式が計算された結果で置き換えられるため、コードがよりシンプルになり、可読性が向上する場合があります。

定数伝播

  • コードサイズの削減:定数伝播によって、変数への代入や変数の参照が不要になる場合があり、結果的にコードサイズが削減されます。
  • 実行速度の向上:定数伝播によって、実行時に計算する必要のあった部分が、コンパイル時に計算済みの定数値に置き換えられるため、実行速度が向上します。
  • 条件分岐の最適化:条件文の条件式が定数で評価できる場合、条件分岐を無条件の文に置き換えることができます。これにより、実行時の分岐予測のオーバーヘッドを削減できます。
  • デッドコードの除去:定数伝播によって、到達不能なコード(デッドコード)が発生する場合があります。これらのデッドコードは、コンパイラによって除去されるため、さらなるコードサイズの削減や実行速度の向上が期待できます。

演算子強度低減

  • 実行速度の向上:低コストな演算に置き換えることで、プログラムの実行時間を短縮できます。
  • コードサイズの削減:場合によっては、コードサイズが小さくなることもあります。
  • 消費電力の削減:低コストな演算は、消費電力の削減にも繋がることがあります。

無用命令の削除

  • 実行速度の向上:無用な命令が削除されることで、プログラムの実行に必要な命令数が減り、実行時間が短縮されます。
  • コードサイズの削減:無用な命令が削除されることで、プログラム全体のサイズが小さくなります。これは、特にリソースが限られた環境 (組み込みシステムなど) で有効です。
  • メモリ使用量の削減:実行時に使用されないデータや命令を削除することで、メモリ使用量を削減できます。

ループ内不変式の移動

  • 実行速度の向上:ループ内で毎回計算する必要のあった不変式を一度だけ計算するように変更することで、無駄な計算を省き、実行速度を向上させます。
  • コードサイズの削減:不変式の計算がループの外で行われるため、ループ内のコードが簡潔になり、結果的にコードサイズも削減されることがあります。

ループのアンローリング

  • 実行速度の向上:ループ制御のオーバーヘッドを削減することで、プログラム全体の実行速度を向上させることができます。
  • 命令レベルの並列化:ループ展開によって、命令レベルの並列化が容易になり、プロセッサの性能をより有効に活用できます。

コメント

タイトルとURLをコピーしました