プロシージャー間分析 (IPA) を使用すると、コンパイラーに、複数の異なるファイル間の最適化 (プログラム全体の分析) ができるようになり、その結果、パフォーマンスが大幅に向上します。プロシージャー間分析は、コンパイル・ステップのみ、あるいはコンパイル・ステップとリンク・ステップの両方 (「プログラム全体」モード) で、指定できます。プログラム全体モードは、最適化の範囲をプログラム単位全体にまで拡張するモードで、実行可能オブジェクトの場合も共用オブジェクトの場合もあります。IPA はコンパイル時間をかなり増大するので、
IPA の使用は、開発過程の最終的なパフォーマンス調整段階に限定する方がよいでしょう。
IPA は、-qipa オプションを指定して使用可能にします。最も一般的に使用されるサブオプションとその効果を、次の表に示します。サブオプションおよび構文の完全セットについては、
-qipa で説明しています。
表 12. 一般に使用される -qipa のサブオプション
サブオプション
| 振る舞い
|
level=0
| プログラム区画と簡単なプロシージャー間の最適化。その内容は次のとおりです。
- 標準ライブラリーの自動認識。
- 静的にバインドされた変数およびプロシージャーのローカライズ。
- 呼び出し関係によるプロシージャーの区分化およびレイアウト。
(相互に頻繁に呼び出すプロシージャーは、メモリー内の比較的近いところにまとめて配置されます。)
- 一部の最適化、特にレジスターの割り振りの拡大。
|
level=1
| インライン化およびグローバル・データ・マッピング。主な機能は次のとおりです。
- プロシージャーのインライン化。
- 参照の類縁性による、静的データの区分化およびレイアウト。
(頻繁に合わせて参照されるデータは、メモリー内の比較的近いところにまとめて配置されます。)
-qipa オプションでサブオプションを指定しない場合は、これがデフォルト・レベルになります。
|
level=2
| グローバル別名分析、特殊化、プロシージャー間データ・フロー:
- プログラム全体の別名分析。このレベルには、ポインター間接参照と間接関数呼び出しの明確化、および関数呼び出しの副次作用に関する情報の細分が含まれます。
- 集中的なプロシージャー間最適化。これは、値の番号付け、コードの伝搬および単純化、条件へのコードの移動またはループ外へのコードの移動、冗長の除去という形で行われます。
- プロシージャー間の定数伝搬、デッド・コードの除去、ポインター分析、および関数間のコードの移動。
- プロシージャーの特殊化 (クローン作成)。
|
inline=variable
| 関数のインライン化が正確に制御できるようになります。
|
fine_tuning
| -qipa には、ほかに、ライブラリー・コードの振る舞いを指定する機能、プログラムの区分化を調整する機能、ファイルからコマンドを読み取る機能などを提供する値があります。
|
-qipa を指定してすべてをコンパイルする必要はありませんが、プログラムのできる限り多くの部分に適用してみてください。以下は提案事項です。
- -qipa オプションは、アプリケーション全体、あるいはそのできるだけ多くの部分の、コンパイルおよびリンク・ステップで指定してください。ライブラリー、共用オブジェクト、および実行可能プログラムに対しても -qipa を使用できますが、
main 関数およびエクスポート機能をコンパイルする場合は、必ず -qipa を使用してください。
- コンパイルとリンクを個別に行う場合は、高速コンパイルのコンパイル・ステップで、-qipa=noobject を使用します。
- Make ファイルで最適化オプションを指定する場合は、必ず、コンパイラー・ドライバー (xlc) を使用してリンクし、リンク・ステップですべてのコンパイラー・オプションを組み込むようにしてください。
- IPA で、従来のコンパイルよりかなり大きなオブジェクト・ファイルを生成したり、
/tmp ディレクトリーに十分なスペース (少なくとも 200 MB) があることを確認したり、
TMPDIR 環境変数を使用して十分なフリー・スペースのある別のディレクトリーを指定したりすることができます。
- リンク時間が長すぎる場合は、level サブオプションを変えてみてください。
-qipa=level=0 を指定したコンパイルは、追加リンク時間が短い場合に非常に有益です。
- インライン化された関数のレポートを生成するには、
-qlist または -qipa=list を使用します。インライン化された関数が少なすぎる、あるいは多すぎる場合は、-qipa=inline または -qipa=noinline の使用を検討してください。特定関数のインライン化を制御するには、-Q+ または -Q- を使用します。
