インテル® C++ コンパイラー 19.0 デベロッパー・ガイドおよびリファレンス
関数のインライン展開を行うと、関数呼び出しのランタイム・オーバーヘッドがなくなるため実行時間は短くなります。しかし、インライン展開を行うと、コードサイズやコードの複雑性が増し、コンパイル時間も長くなります。一般に、コンパイラーに関数のインライン展開を指示すると、より広いコンテキストでソースファイルが検証され、より多くの最適化の機会を見つけることができます。
インライン展開レポートは、最適化レポートの一部です。コンパイラー・オプション -qopt-report (Linux* および macOS*) と /Qopt-report (Windows*) は、最適化レポートをさまざまな詳細レベルで生成できます。「最適化レポートオプション」にリストされている関連するコンパイラー・オプションを使用して、フェーズの指定、特定のファイル、stdout、stderr への出力指示、名前の一部に特定の文字列を含むすべてのルーチンからのレポートを生成することができます。
インライン展開レポートは、プログラム中のコンパイルされたルーチンごとにインライン展開されたかどうかの説明を提供します。インライン展開レポートは、最適化レポートの一部として生成されます。最適化レポートにインライン展開レポートのみを含めるように制限するには、-qopt-report-phase=ipo (Linux* および macOS*) または -Qopt-report-phase:ipo (Windows*) オプションを使用します。
インライン展開レポートのレベルを指定することで、レポートに含まれる情報量を制御できます。レベルは 1 ~ 5 の範囲で、レベル 1 には最小の情報が含まれます。レベルが上がるごとにレポートに追加される情報が増えます。レベル 2 がデフォルトのレポートです。
レベル | サマリー |
---|---|
レベル 1 | インライン展開された呼び出しを示します。 |
レベル 2 (デフォルトのレポート) | 主なインライン展開オプションの値を示します。 |
レベル 3 | 外部リンクを含むルーチンの呼び出しを示します。 |
レベル 4 | 次の情報を示します。
|
レベル 5 | アプリケーション・パフォーマンスを向上する可能性があるインライン展開の変更に関するアドバイスを含む、インライン展開の注釈を示します。 |
インライン展開レポートは、コンパイラーによるインライン展開に関する詳細な概要 (レベル 5) を提供します。レベルは、-qopt-report=1、-qopt-report=2 など (Linux* および macOS*) または /Qopt-report=1、/Qopt-report=2 など (Windows*) です。特定のレベルの詳細は、以下を参照してください。
-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 - インライン展開オプションの値 |
---|
インライン展開オプション値: -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 は、アプリケーション中の外部ルーチンの呼び出しごとに 1 行を追加します。外部ルーチンのコードはコンパイルするファイルに存在しないため、これらの呼び出しはインライン展開の対象外です。
例: インライン展開レポートレベル 3 - 外部リンク |
---|
最適化レポート開始: APPLU レポート: プロシージャー間の最適化 [ipo] インライン展開レポート: (APPLU) [1] applu.f (1,16) -> 外部関数: (1,16) for_set_reentrancy -> 外部関数: (80,7) for_read_seq_lis |
レベル 4 は、次の 4 つの情報を追加します。
例: プログラム全体 |
---|
プログラム全体 (SAFE) [いずれかのメソッド]: false プログラム全体 (SEEN) [テーブルメソッド]: true プログラム全体 (READ) [オブジェクト・リーダー・メソッド]: false |
プログラム全体が認識されるアプリケーションのほうが、そうでないアプリケーションよりも高度な最適化が適用されます。インテル® コンパイラーは、テーブルメソッドとオブジェクト・リーダー・メソッドを使用してプログラム全体を認識します。
例: ルーチンのサイズ (sz) とルーチンをインライン展開したサイズ (isz) |
---|
-> インライン展開: (295,12) SETBV (isz = 752) (sz = 755) -> インライン展開: (398,18) EXACT (isz = 98) (sz = 109) |
この例では、ルーチン SETBV が呼び出し元のルーチンにインライン展開されています。SETBV のインライン展開前のサイズは 755 ユニットです。インライン展開後、呼び出しルーチンのサイズは 752 ユニット増加します。呼び出しルーチンのサイズの増加は、SETBV がインライン展開されることでその呼び出しに伴うオーバーヘッドが排除されるため、SETBV のサイズよりもやや小さくなります。
例: コンパイルにかかった時間のパーセンテージ |
---|
インライン展開レポート: (APPLU) [1/16=6.2%] applu.f (1,16) |
この例では、[1/16 = 6.2%] は APPLU が 16 個あるルーチンの中で最初にコンパイルされ、そのコンパイル処理が完了すると、コンパイル全体の 6.2% が完了することを示しています。この数値を利用して、コンパイルにかかる時間を予測できます。
例: インライン展開されなかった呼び出し |
---|
-> (303,12) ERHS (isz = 2125) (sz = 2128) [[ インライン展開すると -inline-max-size 値を超えます。(2128>253)]] |
この例では、ルーチン ERHS のサイズ (2128 ユニット) が許容サイズ (253 ユニット) よりも大きいため、このルーチンはインライン展開されません。このような大きなルーチンをインライン展開する場合は、-inline-max-size=2128 オプション (サイズは必要に応じて調整) を使用します。
レベル 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” を追加してください。 |