プロシージャー間の最適化 (IPO) レポート

IPO レポートはインライン展開された関数についての情報を提供し、問題のあるループの特定に役立ちます。また、コンパイラーがソースコードに適用した IPO の場所と方法を特定するのにも役立ちます。

次の例では、最小限の出力で IPO レポートを実行するコマンドを示します。

オペレーティング・システム

構文例

Linux* および Mac OS* X

icc -opt-report 1 -opt-report-phase=ipo a.cpp b.cpp

Windows

icl /Qopt-report:1 /Qopt-report-phase:ipo a.cpp b.cpp

-opt-report (Linux および Mac OS X) または /Qopt-report (Windows) は、レポート・ジェネレーターを起動し、-opt-report-phase=ipo (Linux および Mac OS X) または /Qopt-report-phase:ipo (Windows) は、レポートを生成するフェーズ (ipo) を示します。

-opt-report-file (Linux および Mac OS X) または /Qopt-report-file (Windows) を使用して、レポート結果をキャプチャーする出力ファイルを指定します。結果をキャプチャーするファイルを指定することで、結果の解析に費やす時間を短縮でき、後に行うテスティングの基本ラインをつかむことができます。

出力ファイル

IPO レポートの詳細情報には、プログラム全体の解析とインライン展開の 2 つのセクションがあります。デフォルトでは、中レベルの詳細が含まれるレポートが生成されます。レポート結果をキャプチャーする出力ファイルは指定することができます。詳細レベルを最大にして IPO レポートを実行すると、非常に広範囲で専門的な内容がレポート結果に出力されます。結果をキャプチャーするファイルを指定することで、解析時間を短くすることができます。次のサンプルレポートは、一般的なレイアウトを示しています。

サンプル IPO レポート

IP 最適化レポート:

...

プログラム全体 (SAFE) [いずれかのメソッド]: TRUE

プログラム全体 (SEEN) [テーブルメソッド]: TRUE

プログラム全体 (READ) [オブジェクト・リーダー・メソッド]: TRUE

インライン展開オプション値:

  -inline-factor: 100

  -inline-min-size: 7

  -inline-max-size: 230

  -inline-max-total-size: 2000

  -inline-max-per-routine: disabled

  -inline-max-per-compile: disabled

インライン展開レポート: (main) [1/5=20.0%]

  -> インライン展開: _Z3bari(6) (isz = 12) (sz = 17 (5+12))

  -> _ZNSolsEPFRSoS_E(EXTERN)

...

次の表は、一般的なレポート要素と結果の解釈に役立つ説明をまとめたものです。

レポート要素

説明

プログラム全体 (SAFE) [いずれかのメソッド]:

TRUE または FALSE

  • TRUE: コンパイラーが、両方またはいずれかのプログラム全体の解析モデルを使用して、コンパイル時にプログラム全体を対象にしたことを示します。

  • FALSE: コンパイラーが、コンパイル時にプログラム全体を対象にしなかったことを示します。コンパイラーによるプログラム全体の IPO の適用はできませんでした。

プログラム全体の解析モデルについての詳細は、「プロシージャー間の最適化の概要」を参照してください。

プログラム全体 (SEEN) [テーブルメソッド]:

TRUE または FALSE

  • TRUE: コンパイラーがアプリケーション・コードまたはコンパイラー内の関数の標準テーブルにあるすべての参照のいずれかを解決したことを示します。

  • FALSE: コンパイラーがすべての参照を解決できなかったことを示します。1 つまたは複数の関数参照が、ユーザーコードあるいは標準関数テーブルの中で見つけられなかったことを示します。

プログラム全体 (READ) [オブジェクト・リーダー・メソッド]:

TRUE または FALSE

  • TRUE: コンパイラーが –O0 (Linux および Mac OS X) または /Od (Windows) オプションに相当するレベルのリンクの条件をすべて満たしたと判断したことを示します。

  • FALSE: コンパイラーが 1 つまたは複数の参照を解決できなかったことを示します。リンクに失敗しました。

インライン展開オプション値:

次のデベロッパーが指示するインライン展開オプションで使用されるコンパイル値を示します。

  • inline-factor

  • inline-min-size

  • inline-max-size

  • inline-max-total-size

  • inline-max-per-routine

  • inline-max-per-compile

1 つまはた複数のオプションを指定すると、レポートでは指定された値がリストされます。オプションと値を指定しない場合は、コンパイラーはリストされたオプションのデフォルト値を使用し、レポートにはデフォルト値が表示されます。

値は、各オプションの「コンパイラー・オプション」にリストされている同じ中間言語ユニットを示します。これらのオプションの使用については、「デベロッパーが指示するユーザー関数のインライン展開」を参照してください。

インライン展開レポート:

次の形式で示されます。

(<name>) [<current number>/<total number>=<percent complete>]

各アイテムの意味は次のとおりです。

  • <name>: レポートされる関数名です。

  • <current number>: レポートされる関数の数です。すべての関数でインライン展開できるわけではありません。current number と差がでることがあります。

  • <total number>: 評価される関数の合計数です。

  • <percent complete>: インライン展開される関数の比率です。

インライン展開:

関数がインライン展開されると、関数行にプリフィックス "-> インライン展開: _" が付きます。

オプションレポートには、マングル化された関数名が表示されます。

レポートでは、次の一般的な構文形式が使用されます。

-> インライン展開: _<name>(#) (isz) (sz)

各アイテムの意味は次のとおりです。

  • <name> : マングル化された関数名です。(C++ の場合。C 関数の場合は名前はマングル化 されません。) スタティック関数は、マングル化された関数名を番号付きのサフィックスで表示します。

  • #: 関数番号を指定する固有の整数を示します。

  • sz: 最適化前の関数サイズを示します。最適化を行う前の元の命令数の概算です。

  • isz: 最適化後の関数サイズを示します。この値 (isz) は、最適化前のサイズ (sz) よりも小さいかまたは同じです。

  • exec_cnt: コンパイル時にプロファイルに基づく最適化が指定されたことを示します。このサイトから関数が呼び出された回数を示します。

Note icon

次のコマンドを入力すると、マングル化された名前を読み取り可能にすることができます。

Linux: echo <mangled_name> | c++filt

Windows: undname <mangled_name>

インライン展開を行えなかった関数には、"インライン展開" プリフィックスが付いていません。また、コンパイラーは次の規則を使用してインライン展開されなかった関数をマークします。

  • EXTERN は、コンパイラーがコードを提供しなかった外部の関数呼び出しを含む関数を示します。

  • ARGS_IN_REGS は、インライン展開が行われなかったことを示します。

    IA-32 アーキテクチャーとインテル® 64 アーキテクチャーの場合、インライン展開されなかった関数に対する別の手段は、標準的な呼び出し規則を使わずに、コンパイラーがレジスターにある関数の引数を渡すことができるようにすることです。ただし、IA-64 アーキテクチャーの場合は、これはデフォルトの動作です。

デッド・スタティック関数排除:

レポートされた関数が不要なスタティック関数であることを示します。これらの関数のコードを作成する必要はありません。この動作により、全体のコードサイズを抑えることができます。