インテル® C++ コンパイラー 18.0 デベロッパー・ガイドおよびリファレンス

インライン展開レポート

関数のインライン展開を行うと、関数呼び出しのランタイム・オーバーヘッドがなくなるため実行時間は短くなります。しかし、インライン展開を行うと、コードサイズやコードの複雑性が増し、コンパイル時間も長くなります。一般に、コンパイラーに関数のインライン展開を指示すると、より広いコンテキストでソースファイルが検証され、より多くの最適化の機会を見つけることができます。

インライン展開レポートは、最適化レポートの一部です。コンパイラー・オプション -qopt-report (Linux* および macOS*) と /Qopt-report (Windows*) は、最適化レポートをさまざまな詳細レベルで生成できます。「最適化レポートオプション」にリストされている関連するコンパイラー・オプションを使用して、フェーズの指定、特定のファイル、stdoutstderr への出力指示、名前の一部に特定の文字列を含むすべてのルーチンからのレポートを生成することができます。

インライン展開レポートは、プログラム中のコンパイルされたルーチンごとにインライン展開されたかどうかの説明を提供します。インライン展開レポートは、最適化レポートの一部として生成されます。最適化レポートにインライン展開レポートのみを含めるように制限するには、-qopt-report-phase=ipo (Linux* および macOS*) または -Qopt-report-phase:ipo (Windows*) オプションを使用します。

インライン展開レポートのレベルを指定することで、レポートに含まれる情報量を制御できます。レベルは 1 ~ 5 の範囲で、レベル 1 には最小の情報が含まれます。レベルが上がるごとにレポートに追加される情報が増えます。レベル 2 がデフォルトのレポートです。

レベル サマリー
レベル 1 インライン展開された呼び出しを示します。
レベル 2 (デフォルトのレポート) 主なインライン展開オプションの値を示します。
レベル 3 外部リンクを含むルーチンの呼び出しを示します。
レベル 4 次の情報を示します。
  • プログラム全体の情報
  • インライン展開された各ルーチンのサイズ (sz) と個々のインライン展開によるアプリケーション・サイズ (isz) の増加
  • ルーチンのパーセンテージ
  • インライン展開されなかった呼び出し
レベル 5 アプリケーション・パフォーマンスを向上する可能性があるインライン展開の変更に関するアドバイスを含む、インライン展開の注釈を示します。

インライン展開レポートは、コンパイラーによるインライン展開に関する詳細な概要 (レベル 5) を提供します。レベルは、-qopt-report=1-qopt-report=2 など (Linux* および macOS*) または /Qopt-report=1/Qopt-report=2 など (Windows*) です。特定のレベルの詳細は、以下を参照してください。

レベル 1

-qopt-report で最適化レポートを実行するとインライン展開レポートが有効になります。

コンパイルするルーチンごとに、そのルーチンにインライン展開された呼び出しを示す INLINE REPORT というタイトルのレポートが 1 つ出力されます。

例: インライン展開レポートレベル 1 - 典型的なルーチン

インライン展開レポート: (APPLU)
  -> インライン展開: (295,12) SETBV
    -> インライン展開: (398,18) EXACT
    -> インライン展開: (399,18) EXACT
    -> インライン展開: (409,18) EXACT
    -> インライン展開: (410,18) EXACT
    -> インライン展開: (420,18) EXACT
    -> インライン展開: (421,18) EXACT
  -> インライン展開: (299,12) SETIV
  -> (303,12) ERHS
  -> (307,12) SSOR
  -> インライン展開: (311,12) ERROR
    -> インライン展開: (1518,24) EXACT
    -> インライン展開: (1552,24) EXACT
  -> インライン展開: (315,12) PINTGR
  -> (319,12) VERIFY

レポートには、コンパイルしたルーチン (APPLU) の名前と、コンパイラーがインライン展開するかしないか決定した呼び出しごとに 1 行が含まれます。上記のレポートでは、ルーチン APPLU 中の呼び出しについて、コンパイラーは 15 のインライン展開に関する決定を下しています。そのうち 12 個はインライン展開され (「-> インライン展開」で始まる行です)、残りの 3 つはインライン展開されませんでした (「インライン展開」と記載されていない行です)。

各行の括弧で囲まれた部分は、ソースコードでの呼び出し位置を示し、その後に続くのは呼び出されるルーチンの名前です。次に例を示します。

-> インライン展開: (398,18) EXACT

これは、398 行目の列 18 にある EXACT という名前のルーチンの呼び出しを指します。

レベル 2

レベル 2 は、インライン展開に関連した重要なコンパイラー・オプションの値を提供します。ユーザーがオプションを使用してコマンドラインでこれらの値を指定しない限り、オプションのデフォルト値が表示されます。個々のインライン展開オプションの詳細は、「インライン展開オプション」を参照してください。

例: インライン展開レポートレベル 2 - インライン展開オプションの値

インライン展開オプション値:
  -inline-factor: 100
  -inline-min-size: 30
  -inline-max-size: 230
  -inline-max-total-size: 2000
  -inline-max-per-routine: 10000
  -inline-max-per-compile: 500000

レベル 3

レベル 3 は、アプリケーション中の外部ルーチンの呼び出しごとに 1 行を追加します。外部ルーチンのコードはコンパイルするファイルに存在しないため、これらの呼び出しはインライン展開の対象外です。

例: インライン展開レポートレベル 3 - 外部リンク

最適化レポート開始: APPLU
	レポート: プロシージャー間の最適化 [ipo]
インライン展開レポート: (APPLU) [1] applu.f (1,16)
   -> 外部関数: (1,16) for_set_reentrancy
   -> 外部関数: (80,7) for_read_seq_lis

レベル 4

レベル 4 は、次の 4 つの情報を追加します。

レベル 5

レベル 5 は、インライン展開の注釈を追加します。

例: 注釈の使用

-> (303,12) ERHS (isz = 2058) (sz = 2061)
   [[ インライン展開すると -inline-max-size 値を超えます。(2061>230) <1>]]

インライン展開の注釈は、二重角括弧 [[ ]] のテキストについて説明します。呼び出しがインライン展開されなかった理由と呼び出しをインライン展開されるようにするために必要なことを示します。

<1> は、インライン展開レポートの最後にあるインライン展開注釈セクション (レベル 5 を指定した際に生成される) の最初の注釈であることを示しています。例えば、上記の <1> に対して、次の注釈テキストが生成されます。

例: 注釈テキスト

<1> サブプログラムのサイズがインライン展開されるサイズを超えました。オプション –inline-max-size を使用してインラインされるサブプログラム
のサイズを増やすか、呼び出した関数の宣言に 
“!DIR$ATTRIBUTES FORCELINE” を追加するか、呼び出しの前に
“!DIR$ FORCELINE” を追加してください。