IPO についての一般的な最適化ガイドラインを示します。
プログラム全体の解析を行うための十分な中間言語 (IL) カバレッジを持たないアプリケーションは、完全な IL 情報を持つアプリケーションに比べると、最適化は十分に行われません。
大規模な IPO コンパイルは、他のコンパイラーの最適化フェーズの内部制限を引き起こすことがあります。
C++ アプリケーションでは、IPO と PGO を組み合わせることが重要なポイントです。-O2、-ipo、および -prof-use (Linux*)、/O2、/Qipo、および -/Qprof-use (Windows*) オプションを使用することで、大幅にパフォーマンスが向上します。
C++ のコンパイルはデフォルトで内部ファイルのインライン展開を行うため、IPO は C++ よりも C でより効果があります。
一般的なガイドラインに加えて、IPO を使用するときに回避するべき作業があります。次にその回避する作業を示します。
異なるコンパイラーで生成された IL ファイルを使用して、IPO コンパイルのリンクフェーズを行わないでください。
コンパイル行およびリンク行に主要な最適化を含めないようにしてください。
IL ファイルが -prof-use (Linux)、/Qprof-use (Windows) オプションを使用して生成された場合を除いて、IL ファイルを -prof-use (Linux)、/Qprof-use (Windows) オプションを使用してリンクしないでください。
IPO を使用してパフォーマンスの向上を達成するには、2 つの重要なポイントがあります。
インライン・ヒューリスティックの操作
プログラム全体の解析の適用範囲
プログラム全体の解析 (WPS) は、実行されると、多くの IP 最適化を有効にします。WPS プロセス中、コンパイラーは、参照がすべて解決され、指定されたシンボルが .il ファイルに定義されているかどうかを判断するために、.il、.obj、および .lib ファイルをすべて読み取ります。
データと関数の両方の .il ファイルに含まれているシンボルは、WPS 最適化操作の対象です。現在、.il 情報は IPO を使用してコンパイルされたファイル用に生成されます。コンパイラーはオブジェクトの内部に .il 情報を埋め込んで、IPO 情報がライブラリー、DLL、および共有オブジェクトの内部に含まれるようにします。
IL を含むモジュールで定義され、IL を含まないモジュールで一度も参照されない変数または関数は、プログラム全体の最適化の対象です。それ以外の変数 (および関数) は、これらの最適化の対象外となります。多くの重要な IPO 最適化は、内部オプションと IP 最適化マスクにより制御することができます。