ベクトル化できないループとベクトル化されていないループを調査

精度レベル

Low (低)

有効となる解析

サーベイ

結果の解釈

ベクトル化とコードの調査パースペクティブを低い精度で実行すると、基本的なベクトル化レポートが表示されます。このレポートには、ベクトル化できないループ、ベクトル化されていないループ、およびその他のパフォーマンスの問題が示されます。

サーベイレポートの場合:

  1. [Self-Time (セルフ時間)][Total-Time (合計時間)] カラムをソートして、最も時間を費やしているループを特定します。

  2. ターゲットのループまたは関数が、ベクトルであるかスカラーであるか確認します。インテル® Advisor は、次のアイコンでベクトルか、スカラーかを区別します。

    • - ベクトル化された関数

    • - ベクトル化されたループ

    • - スカラー関数

    • - スカラーループ

  3. フィルター機能を使用してここでは注目しないコードを非表示にします:

  4. 調査するループまたは関数を決定します。

    • ループ/関数がスカラーである場合

    • ループ/関数がベクトル化されている場合

ループ/関数がスカラーである場合

ターゲットのループ/関数がスカラーである場合 ( または )、コンパイラーがそのループ/関数をベクトル化できなかった原因を調査します。

次のような理由が考えられます。

以下に示すディレクティブの詳細については、インテル® oneAPI DPC++/C++ コンパイラー開発者ガイドおよびリファレンスの OpenMP* プラグマの概要 (英語) をご覧ください。

考えられる理由 確認すること 操作

依存関係が想定される

[Why No Vectorization? (ベクトル化できない理由)] カラムを参照します。[Vector dependence prevents vectorization (ベクトルの依存関係がベクトル化を妨げています)] を検索します。

Dependencies analysis (依存関係解析) を実行します。

  • 依存関係が検出されない場合、omp simd ディレクティブでベクトル化を強制するか、その他の手法でコンパイラーにベクトル化を指示します。

  • 依存関係が確認された場合、それらを解決するか次のループへ進みます。

ループ内の関数呼び出し

[Why No Vectorization? (ベクトル化できない理由)] カラムを参照します。次の問題を探します。

  • 関数呼び出しがあります

  • 間接関数呼び出しがあります

  • シリアル化されたユーザー関数があります

問題がある場合: [Function call present (関数呼び出しがあります)] 問題の場合、次のいずれかを行います。

  • ループに関数をインライン展開します。

  • omp declare simd ディレクティブで関数をベクトル化します。

問題が [Indirect function call present (間接関数呼び出しがあります)] または [Serialized user function call present (シリアル化されたユーザー定義関数があります)] である場合、[Recommendations (推奨事項)] タブのガイドラインを参照します。

コンパイラーが非効率なベクトル化を仮定

[Why No Vectorization? (ベクトル化できない理由)] カラムを参照します。[Loop vectorization possible but seems inefficient (ループのベクトル化は可能ですが非効率)] を探します。

omp simd ディレクティブでベクトル化を強制します。

ベクトル化の強制により効果が得られない場合、その他のディレクティブを試してみてください。

パフォーマンスへの影響とスピードアップの可能性を理解するため、追加の解析を行うことを検討してください。

  • トリップカウント

  • メモリー・アクセス・パターン

その他

次を参照します。

  • [Why No Vectorization? (ベクトル化できない理由)] カラム

  • [Vector Issues (ベクトル化の問題)] カラム

問題を解決するため、コンパイラーの診断の詳細とインテル® Advisor の推奨事項を参照します。

ループ/関数がベクトル化されている場合

ターゲットループがベクトル化されている場合 ()、ベクトル化効率が 90% 以上であることを確認します。

効率が 90% 未満であれば次を検討します。

考えられる理由 確認すること 操作

ISA

[Vectorized Loops/Vector ISA (ベクトル化されたループ/ベクトル ISA)] カラムを参照し、アプリケーションで使用されている ISA を確認します。

適切なコンパイラー・オプションを指定してターゲットの ISA を変更します。

非効率なピール/リマインダー

[Vector Issues (ベクトル化の問題)] カラムを参照します。[Inefficient Peel/Reminder (非効率なピール/リマインダー)] の問題を探します。または、極端に時間を費やしているピール/リマインダーをクリックします。

問題を解決します。

  • [Recommendations (推奨事項)] タブを確認します。

  • トリップカウント解析を実行します。

非効率なメモリー・アクセス・パターンの可能性

[Vector Issues (ベクトル化の問題)] カラムを参照します。[Possible Inefficient Memory Access (非効率なメモリー・アクセス・パターンが存在する可能性)] を探します。

[Instruction Set Analysis/Traits (命令セット解析/特性)] カラムを参照します。次の特性を検索します。

  • extract

  • insert

  • gather

  • scatter

メモリー・アクセス・パターン解析を実行します。

データタイプの変換があります

[Instruction Set Analysis/Traits (命令セット解析/特性)] カラムを参照します。[Type Conversions (データ型の変換があります)] メトリックを検索します。

ベクトル長を短くし、ベクトル化の効率を低下させる float から double への冗長な型変換を排除します。

ループ内のアライメントされていないベクトルのアクセス

[Advanced/Vectorization Details (高度/ベクトル化の詳細)] カラムを参照します。[Unaligned access in vector loop (ベクトルループ内のアライメントされないアクセス)] メトリックを探します。

データをアライメントします。

レジスターへの圧力

[Vector Issues (ベクトル化の問題)] カラムを参照します。[Vector register spilling possible (ベクトルレジスターのスピルの可能性)] を探します。

次のいずれかの方法で問題を解決します。

  • ループのアンロール係数を減らします。

  • ループを小さく分割します。

FMA 命令が効率良く使用されていない可能性

[Vector Issues (ベクトル化の問題)] カラムを参照します。[Potential underutilization of FMA instructions (FMA 命令が効率良く使用されていない可能性)] の問題を探します。

次のいずれかの方法で問題を解決します。

  • ターゲットの ISA を変更します。

  • 明示的に FMA の生成とベクトル化を有効にします。

その他

[Vector Issues (ベクトル化の問題)] カラムを参照します。

問題を解決するにはインテル® Advisor の推奨事項に従います。

次のステップ