インテル® C++ コンパイラー 15.0 ユーザー・リファレンス・ガイド
ベクトル化診断情報を制御します。これは古いオプション (非推奨) です。後継オプションは、-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 |
表示する診断情報のレベルを示す値。設定可能な値は以下のとおりです。
|
オフ |
ベクトル化診断メッセージを表示しません。 |
このオプションは、ベクトル化診断情報を制御します。ベクトル化レポートは .optrpt ファイルに出力されます。
各ベクトル化診断の詳細は、「インテル® C++ コンパイラーのベクトル化診断」 (http://intel.ly/1c3nVmJ (英語)) を参照してください。診断ごとに、その原因、診断を出力するサンプルコード、解決方法 (存在する場合) が記載されています。
-qopt-report または /Qopt-report オプションを指定すると、すべての最適化フェーズのレポートが出力されます。-qopt-report または /Qopt-report を特定のフェーズを指定した -qopt-report-phase または /Qopt-report-phase オプションと一緒に使用すると、その他のフェーズのレポートは出力されません。
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 (英語)) を参照してください。