ベクトル化レポートは、コード中のベクトル化されたループおよびされなかったループとその理由を示します。ベクトル化レポートを生成するには、Qopt-report または Qopt-report-phase:vec コンパイラー・オプションを使用します。
Qopt-report-phase:vec とともに指定すると、Qopt-report:1 オプションはコード中のベクトル化されたループを示すレポートを生成し、Qopt-report:2 オプションはコード中のベクトル化されたループおよびされなかったループとその理由を示すレポートを生成します。
これらのオプションを使用するには、次の操作を行います。
プロジェクトのプロパティー・ページで、[構成プロパティ] > [C/C++] > [Diagnostics [Intel C++] (診断 [インテル® C++])] を選択します。
[Optimization Diagnostic Level (最適化診断レベル)] を [Level 1 (レベル 1) (/Qopt-report:1)] に設定します。
[Optimization Diagnostics Phase (最適化診断フェーズ)] を [Vectorization (ベクトル化) (/Qopt-report-phase:vec)] に設定します。
O1 オプションを指定するとベクトル化が無効になるため、コンパイラーはベクトル化レポートを生成しません。ベクトル化レポートを生成するには、O2 オプションを指定してプロジェクトをビルドしてください。
O2 オプションを設定するには、次の操作を行います。
プロジェクトのプロパティー・ページで、[構成プロパティ] > [C/C++] > [Optimization (最適化)] を選択します。
[Optimization (最適化)] を [Maximize Speed (実行速度)] に設定します。
レポートを表示するため、プリプロセッサー・マクロ NOFUNCCALL を定義して、Driver.c にある matvec() の呼び出しを同等の C コードに置き換えます。プロジェクトのプロパティー・ページで、[構成プロパティ] > [C/C++] > [Preprocessor (プリプロセッサー)] > [Preprocessor Definitions (プリプロセッサーの定義)] のユーザー定義マクロのリストに NOFUNCCALL を追加します (リストに複数のマクロを含める場合はカンマで区切ってください)。
プロジェクトをリビルドし、実行ファイルを開始します ([デバッグ] > [デバッグなしで開始])。新しい実行時間を記録します。[Compiler Optimization Report (コンパイラーによる最適化レポート)] ウィンドウまたはオブジェクト・ディレクトリーの *.optrpt ファイルに示されるように、短縮された時間は主に、行 145 の内部ループの自動ベクトル化によるものです。
例えば、driver.optrpt に以下のメッセージが出力されます。
ループの開始 Driver.c(140,2) Driver.c(145,2): リマーク #25460: ループの最適化はレポートされていません。 ループの開始 Driver.c(143,3) Driver.c(148,3): リマーク #25460: ループの最適化はレポートされていません。 ループの開始 Driver.c(145,4) Driver.c(150,4): リマーク #15300: ループがベクトル化されました。 ループの終了
Qopt-report2 オプションにより生成されるリストには、ベクトル化されなかったループとその理由も含まれます。Qopt-report:1 と同様の操作で、[Optimization Diagnostic Level (最適化診断レベル)] を [Level 2 (レベル 2) (/Qopt-report:2)] に設定して Qopt-report:2 オプションを指定します。
プロジェクトをリビルドします。
ベクトル化レポートは、Multiply.c の行番号 37 のループが、ループの入れ子の最内ループではないためにベクトル化しなかったことを示しています。行番号 49 の最内ループの 2 つのバージョンが生成され、1 つのバージョンはベクトル化されました。
Multiply.optrpt に以下のメッセージが出力されます。
ループの開始 Multiply.c(37,5) Multiply.c(37,5): リマーク #15542: ループはベクトル化されませんでした: 内部ループがすでにベクトル化されています。 ループの開始 Multiply.c(49,9) ベクトル化のピールループ、マルチバージョン v1 ループの終了 ループの開始 Multiply.c(49,9) マルチバージョン v1 Multiply.c(49,9): リマーク #15300: ループがベクトル化されました。 ループの終了 ループの開始 Multiply.c(49,9) 代替アライメントでベクトル化されたループ、マルチバージョン v1 ループの終了 ループの開始 Multiply.c(49,9) ベクトル化の剰余ループ、マルチバージョン v1 ループの終了 ループの開始 Multiply.c(49,9) マルチバージョン v2 Multiply.c(49,9): リマーク #15304: ループはベクトル化されませんでした: マルチバージョンのベクトル化できないループ・インスタンスです。 ループの終了 ループの開始 Multiply.c(49,9) 剰余、マルチバージョン v2 ループの終了 ループの終了
行番号および列番号は異なる場合があります。
Qopt-report および Qopt-report-phase コンパイラー・オプションの詳細については、『デベロッパー・ガイドおよびリファレンス』の「コンパイラー・オプション」を参照してください。