インテル® C++ コンパイラー 15.0 ユーザー・リファレンス・ガイド

vec-report、Qvec-report

ベクトル化診断情報を制御します。これは古いオプション (非推奨) です。後継オプションは、-qopt-report -qopt-report-phase=vec (Linux* および OS X*) または /Qopt-report /Qopt-report-phase:vec (Windows*) です。

構文

Linux* および OS X*:

-vec-report[=n]

Windows*:

/Qvec-report[:n]

引数

n

表示する診断情報のレベルを示す値。設定可能な値は以下のとおりです。

0

診断情報を表示しません。

1

ベクトル化されたループを表示します。

2

ベクトル化されたループとベクトル化されなかったループを表示します。n が指定されない場合のデフォルトの値です。

3

ベクトル化されたループとベクトル化されなかったループ、および判明した依存関係または想定される依存関係を表示します。

4

ベクトル化されなかったループを表示します。

5

ベクトル化されなかったループとその理由を表示します。

6

ベクトル化されたループとベクトル化されなかったループ、および判明した依存関係または想定される依存関係の詳細を表示します。 これは古い値です。後継の値はありません。将来のリリースでは、5 が最も詳細な診断情報を出力するレベルになります。

7

ベクトル化されたループのベクトルコード品質メッセージ ID と対応するデータ値を出力します。 メッセージには、スピードアップの予想、メモリー・アクセス・パターン、ベクトル化されたループのベクトルスタイルの数などの情報が含まれます。 これは古い値です。後継の値はありません。将来のリリースでは、5 が最も詳細な診断情報を出力するレベルになります。

デフォルト

オフ

ベクトル化診断メッセージを表示しません。

説明

このオプションは、ベクトル化診断情報を制御します。ベクトル化レポートは .optrpt ファイルに出力されます。

各ベクトル化診断の詳細は、「インテル® C++ コンパイラーのベクトル化診断」 (http://intel.ly/1c3nVmJ (英語)) を参照してください。診断ごとに、その原因、診断を出力するサンプルコード、解決方法 (存在する場合) が記載されています。

-qopt-report または /Qopt-report オプションを指定すると、すべての最適化フェーズのレポートが出力されます。-qopt-report または /Qopt-report を特定のフェーズを指定した -qopt-report-phase または /Qopt-report-phase オプションと一緒に使用すると、その他のフェーズのレポートは出力されません。

IDE オプション

Windows*: [Diagnostics (診断)] > [Vectorizer Diagnostic Level (ベクトル化診断レベル)]

Linux*: [Compilation Diagnostics (コンパイル診断)] > [Vectorizer Diagnostic Report (ベクトル化診断レポート)]

OS X*: [Diagnostics (診断)] > [Vectorizer Diagnostic Report (ベクトル化診断レポート)]

代替オプション

なし

次の例は、Linux* システムで -vec-report を指定した場合の効果を示します。出力されるリマークはコプロセッサーにより異なります。

void foo0(int n, int *a)
{
    for (int i = 0; i < n; ++i) {
        if (n & 1) {
            a[i] = a[i+1];
        }
    }
}

void foo1(int n, int *a)
{
   // データ依存があるためベクトル化されません。
    for (int i = 1; i < n; ++i) {
        if (n & 1) {
            a[i] = a[i-1];
        }
    }
}
zsh/4 68 % icpc -c -simd -vec_report1 example.cpp
example.cpp(3): (列 5) リマーク: ループがベクトル化されました。

zsh/4 69 % icpc -c -simd -vec_report2 example.cpp
example.cpp(3): (列 5) リマーク: ループがベクトル化されました。
example.cpp(3): (列 5) リマーク: ループはベクトル化されませんでした: 空のループはベクトル化できません。
example.cpp(12): (列 5) リマーク: ループはベクトル化されませんでした: ベクトル依存関係が存在しています。
example.cpp(12): (列 5) リマーク: ループはベクトル化されませんでした: 空のループはベクトル化できません。

zsh/4 70 % icpc -c -simd -vec_report3 example.cpp
example.cpp(3): (列 5) リマーク: ループがベクトル化されました。
example.cpp(3): (列 5) リマーク: 剰余ループがベクトル化されました。
example.cpp(3): (列 5) リマーク: ループはベクトル化されませんでした: 空のループはベクトル化できません。
example.cpp(12): (列 5) リマーク: ループはベクトル化されませんでした: ベクトル依存関係が存在しています。
example.cpp(14): (列 13) リマーク: ベクトル依存関係: FLOW の依存関係が a 行 14 と a 行 14 の間に仮定されました。
example.cpp(12): (列 5) リマーク: ループはベクトル化されませんでした: 空のループはベクトル化できません。

zsh/4 73 % icpc -c -simd -vec_report6 example.cpp
example.cpp(3): (列 5) リマーク: ベクトル化のサポート: アンロールファクターが 4 に設定されます。
example.cpp(3): (列 5) リマーク: ループがベクトル化されました。
example.cpp(3): (列 5) リマーク: 剰余ループがベクトル化されました。
example.cpp(3): (列 5) リマーク: ループはベクトル化されませんでした: 空のループはベクトル化できません。
example.cpp(12): (列 5) リマーク: ループはベクトル化されませんでした: ベクトル依存関係が存在しています。
example.cpp(14): (列 13) リマーク: ベクトル依存関係: FLOW の依存関係が a 行 14 と a 行 14 の間に仮定されました。
example.cpp(12): (列 5) リマーク:  ループはベクトル化されませんでした: 空のループはベクトル化できません。

Linux* で、次のコマンドを実行した場合について考えてみます。

icc -c -vec-report7 satSub.c 2>&1 | vecanalysis.py --list

次のプログラムを実行します。

#define SAT_U8(x) ((x) < 0 ? 0 : (x))
void satsub(
  unsigned char *a,
  unsigned char *b,
  int n
){
  int i;
#pragma simd
  for (i=0; i<n; i++){
    a[i] = SAT_U8(a[i] - b[i]);
  }
}

上記のプログラムに対し、コンパイラーは出力としてメッセージ ID を生成します。そして、vecanalysis.py スクリプトは、そのメッセージ ID を入力値として受け取り、行番号と vec-report=7 メッセージが埋め込まれたオリジナルのソースコードを含む .txt ファイルを作成します。これらの情報を参照することで、ASM コードを解析することなく、生成されたベクトルコードの品質を理解することができます。

作成される .txt ファイルには、プログラム名に似た名前が付けられます。例えば、プログラム名が satSub.c の場合、テキストファイル名は satSub_c_vr.txt になります。スクリプトを実行すると、.txt ファイルの名前を示すメッセージが表示されます。例えば、「Writing satSub_c_vr.txt ... done」のようなメッセージが表示されます。

vecanalysis.py スクリプトの場所については、「インテル® C++/Fortran コンパイラーのベクトル化レポートを基にソースにアノテーションを付ける Python* スクリプト」 (http://intel.ly/XeSkW6 (英語)) を参照してください。


このヘルプトピックについてのフィードバックを送信