インテル® C++ コンパイラー 14.0 ユーザー・リファレンス・ガイド
ベクトライザーの診断情報を制御します。
-vec-report=0 |
コマンドラインでオプションを指定しない場合、デフォルトではメッセージを表示しません。ただし、ベクトライザー診断レポートが有効で n が指定されていない場合、コンパイラーはベクトル化されたループの診断を表示します。 |
このオプションは、ベクトライザーの診断情報を制御します。ベクトル化レポートは stdout に出力されます。
n を指定しない場合、1 を指定して [Q]vec-report オプションを使用するのと同じです。
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 (英語)) を参照してください。