プロシージャー間分析 (IPA) を使用すると、コンパイラーは異なるファイルにまたがった最適化を行うことが
でき (全プログラム分析)、有効なパフォーマンス向上をもたらします。
プロシージャー間分析はコンパイル・ステップでのみ、またはコンパイルおよびリンク・ステップで指定できます
(全プログラム ・モード)。
全プログラム・モードは、最適化の有効範囲をプログラム単位全体に拡張し、実行可能または共用オブジェクトに
することができます。
全プログラム IPA 分析は、大きなプログラムのコンパイルまたはリンク時に、かなりのメモリー量と時間を消費します。
IPA は -qipa オプションによって使用可能になります。
最も一般的に使用されるサブオプションの効果を以下に要約します。
一般に使用される -qipa サブオプション
|
サブオプション
| 動作
|
level=0
| プログラム区分化と単純プロシージャー間最適化。
これは以下から構成されます。
- 標準ライブラリーの自動認識。
- 静的にバインドされた変数およびプロシージャーのローカリゼーション。
- 呼び出し関係に応じたプロシージャーの区分化とレイアウト。
呼び出し類縁性 とも呼ばれます。
(相互に頻繁に呼び出すプロシージャーは、メモリー内で近くに置かれます。)
- 一部の最適化の有効範囲の拡張 (特にレジスター割り振り)。
|
level=1
| インライン化とグローバル・データ・マッピング。
特に以下を行います。
- プロシージャーのインライン化。
- 参照類縁性に応じた静的データの区分化とレイアウト。
(ともに頻繁に参照されるデータは、メモリー内で近くに置かれます。)
-qipa が指定されたときは、これがデフォルトになります。
|
level=2
| グローバル別名分析、特殊化、プロシージャー間データ・フロー。
- 全プログラム別名分析。
このレベルには、ポインター間接参照と間接関数呼び出しの明確化と、関数呼び出しの副次作用に関する情報の改良が
含まれます。
- 集約的プロシージャー内最適化。
これは、値の番号付け、コード伝播および単純化、条件への、またはループからのコード動作、冗長度の除去の
かたちをとります。
- プロシージャー間定数伝搬、不要コード除去、ポインター分析。
- プロシージャー特殊化 (クローン作成)。
|
inline=inline-options
| インライン化の正確なユーザー制御を提供します。
|
fine_tuning
| -qipa= の他の値では、ライブラリー・コードの
動作の指定、プログラム区分化の調整、ファイルからのコマンド読み取りなどの能力が提供されます。
|
あらゆるものを -qipa でコンパイルする必要はありませんが、可能な限り
多くのプログラムにこれを適用するようにしてください。
以下にいくつかの提案を示します。
- makefile で最適化オプションを指定するときは必ず、リンクのためのコンパイラー・コマンド
(xlf、xlf90 など) を使用し、リンク・ステップですべてのコンパイラー・オプションを
組み込みます。
- -qipa は、実行可能または共用オブジェクトを作成するときに機能しますが、
常にメインおよび -qipa でエクスポートされた関数をコンパイルします。
- コンパイルとリンクを別個に行うときは、高速化のために -qipa=noobject を
コンパイル・ステップで使用します。
- 十分なスペースが /tmp にあること (最低 200 MB) を確認するか、または
TMPDIR 環境変数を使用して十分なフリー・スペースを持つ異なるディレクトリーを指定します。
- level サブオプションはスロットルです。
リンク時間が長すぎる場合はこれを変えてみてください。
-qipa=level=0 でのコンパイルは、余分なリンク時間をかけたくないときに
非常に有効です。
- -qlist または -qipa=list でのコンパイルの
後で、生成されたコードを見てください。
インライン化された関数が少なすぎる、または多すぎる場合は、-qipa=inline または
-qipa=noinline の使用を検討してください。
特定の関数のインライン化を制御するには、-Q+ および -Q- を
使用してください。
- Fortran と、IBM XL C/C+ コンパイラーでコンパイルした C または
C++ コードの組み合わせがアプリケーションに含まれている場合、-qipa オプションを指定して
コードすべてをコンパイルすることで、より以上の最適化を達成することができます。
- 関連情報:
-
