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

vec-report、Qvec-report

ベクトライザーの診断情報を制御します。

構文

Linux* および OS X*:

-vec-report[=n]

Windows*:

/Qvec-report[:n]

引数

n

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

0

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

1

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

2

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

3

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

4

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

5

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

6

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

7

ベクトル化されたループのベクトルコード品質メッセージ ID と対応するデータ値を出力します。 メッセージには、スピードアップの予想、メモリー・アクセス・パターン、ベクトル化されたループのベクトルスタイルの数などの情報が含まれます。

デフォルト

-vec-report=0
または /Qvec-report:0

コマンドラインでオプションを指定しない場合、デフォルトではメッセージを表示しません。ただし、ベクトライザー診断レポートが有効で n が指定されていない場合、コンパイラーはベクトル化されたループの診断を表示します。

説明

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

n を指定しない場合、1 を指定して [Q]vec-report オプションを使用するのと同じです。

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 (英語)) を参照してください。


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