最適化レポートをソースリストに挿入

同カテゴリーの次の記事

インテル® SSE およびインテル® AVX 世代 (SSE2、SSE3、SSSE3、ATOM_SSSE3、SSE4.1、SSE4.2、ATOM_SSE4.2、AVX、AVX2、AVX-512) 向けのインテル® コンパイラー・オプションとプロセッサー固有の最適化

この記事は、インテル® デベロッパー・ゾーンに掲載されている「Annotated source listing with optimization reports」の日本語参考訳です。


インテル® C++/Fortran コンパイラー 17.0 以降では、最適化サポートをソースコード行に注釈する新しいオプションが提供されています。

訳者注: Windows* 上での日本語版のインテル® コンパイラーは、日本語のアノテーションを正しく生成することができないことがあります。生成されたファイルが文字化けする際は、コンパイルオプションに /Qdiag-message-catalog- を追加して英語メッセージに切り替えてください。

シンタックス
Windows*: /Qopt-report-annotate[:<keyword>] 
Linux* および macOS*: -qopt-report-annotate[=<keyword>]
キーワードに指定されるフォーマットで最適化レポート付きのソースコードを出力します。指定可能なフォーマットは以下です。
html – HTML 形式で出力します
text – テキスト形式で出力します (デフォルト)

Windows*: /Qopt-report-annotate-position:<keyword>
Linux* および macOS*: -qopt-report-annotate-position=<keyword>
最適化レポートがソースコードのどの位置に挿入されるかを指定します。指定可能なキーワードは以下です。
caller – 関数の呼び出し側
callee – 呼び出し先の関数
both   – caller と callee の両方

スコープと利用例
Windows* コマンドラインのユーザーと Linux* ユーザーは、この機能を使用して最適化レポートとソースリストを統合できます。インライン展開された注釈付きのソースで、ループに関連する最適化レポートが表示される位置を指定します。

  1. このオプションは、コンパイラーがインライン展開した関数のみに関連し、関数がインライン展開された場所、またはインライン展開された関数自身かその両方が終了する呼び出し先を指定します。
  2. このオプションは、最適化に関連するループのみを考慮します (例えば、LOOP BEGIN で始まり、LOOP END で終わる出力部分)。


#icc -c -qopt-report5 -qopt-report-annotate -qopt-report-annotate-position=callee annotate.c コマンドラインを使用してコンパイルすると、ワーキング・ディレクトリーに “annotate.c.annot” という注釈付きのソースファイルが作成されます。
annotate.c.annot を開くと、注釈付きのソース行を見ることができます。

loop optimization report:
16        h = (double)1.0/(double)N;
17        sum = 0.0;
18
19        for ( i=0; i<N ; i++ ){
//
//LOOP BEGIN at /<absolute path to source file>/annotate.c(19,3) inlined into /<absolute path to source file>/annotate.c(35,14)
//   remark #15305: vectorization support: vector length 2
//   remark #15399: vectorization support: unroll factor set to 4
//   remark #15309: vectorization support: normalized vectorization overhead 0.108
//   remark #15300: LOOP WAS VECTORIZED
//   remark #15475: --- begin vector cost summary ---
//   remark #15476: scalar cost: 46
//   remark #15477: vector cost: 25.500
//   remark #15478: estimated potential speedup: 1.800
//   remark #15486: divides: 1
//   remark #15487: type converts: 1
//   remark #15488: --- end vector cost summary ---
//   remark #25015: Estimate of max trip count of loop=125000000
//LOOP END
//
//LOOP BEGIN at /<absolute path to source file>/annotate.c(19,3)
//   remark #15305: vectorization support: vector length 2
//   remark #15399: vectorization support: unroll factor set to 4
//   remark #15309: vectorization support: normalized vectorization overhead 0.108
//   remark #15300: LOOP WAS VECTORIZED
//   remark #15475: --- begin vector cost summary ---
//   remark #15476: scalar cost: 46
//   remark #15477: vector cost: 25.500
//   remark #15478: estimated potential speedup: 1.800
//   remark #15486: divides: 1
//   remark #15487: type converts: 1
//   remark #15488: --- end vector cost summary ---
//   remark #25015: Estimate of max trip count of loop=125000000
//LOOP END
20            x = h*(i-0.5);
21            sum = sum + f(x);


Inline report:
13      double f2(){
//INLINE REPORT: (f2()) [3/3=100.0%] /<absolute path to source file>/annotate.c(13,12)
//  -> INLINE: (21,19) f(double) (isz = 2) (sz = 9)
//
///<absolute path to source file>/annotate.c(13,12):remark #34051: REGISTER ALLOCATION : [f2] /<absolute path to source file>/annotate.c:13
//
//    Hardware registers
//        Reserved     :    2[ rsp rip]
//        Available    :   39[ rax rdx rcx rbx rbp rsi rdi r8-r15 mm0-mm7 zmm0-zmm15]
//        Callee-save  :    6[ rbx rbp r12-r15]
//        Assigned     :   16[ rax rdx zmm0-zmm13]
//
//    Routine temporaries
//        Total         :      53
//            Global    :      15
//            Local     :      38
//        Regenerable   :       6
//        Spilled       :       0
//
//    Routine stack
//        Variables     :       0 bytes*
//            Reads     :       0 [0.00e+00 ~ 0.0%]
//            Writes    :       0 [0.00e+00 ~ 0.0%]
//        Spills        :       0 bytes*
//            Reads     :       0 [0.00e+00 ~ 0.0%]
//            Writes    :       0 [0.00e+00 ~ 0.0%]
//
//    Notes
//
//        *Non-overlapping variables and spills may share stack space,
//         so the total stack size might be less than this.
//
//
14        int i;
15        double sum, pi, x, h;
16        h = (double)1.0/(double)N;
17        sum = 0.0;

上記のレポートから、インライン展開されたループの最適化レポートが生成されていることが分かります。

コンパイラーの最適化に関する詳細は、最適化に関する注意事項を参照してください。

関連記事