ベクトル最も有効な場所の特定

ベクトル化とコードの調査パースペクティブを使用すると、アプリケーション内でベクトル並列処理から最大のメリットを得られるループと関数を識別し、ベクトル化されていない、またはベクトル化が不十分な時間のかかる関数/ループを見つけ、ベクトル化によって達成されるパフォーマンスの向上の見積もりを計算できます。

このページでは、vec_samples アプリケーションをプロファイルし、ベクトル化ホットスポットを特定してコードのパフォーマンスを向上させる方法について説明します。自身のアプリケーションを使用して、以下の手順に従うこともできます。

次の操作を行います。

  1. アプリケーションを展開してビルドします
  2. パフォーマンスのベースラインを測定する
  3. ポインターの曖昧さを解消します
  4. 最高レベルの命令セット・アーキテクチャー向けの命令を生成します
  5. 次のステップ

必要条件

  1. インテル® Advisor は、スタンドアロン製品 (英語) またはインテル® oneAPI ベース・ツールキットの一部 (英語) としてインストールできます。インストール手順については、ユーザーガイドのインテル® Advisor のインストールを参照してください。
  2. インテル® oneAPI DPC++/C++ コンパイラーがインストールされていることを確認してください。インテル® oneAPI ベース・ツールキットをインストールしている場合は、コンパイラーがその一部として既にインストールされています。それ以外の場合は、コンパイラーをスタンドアロン製品としてインストールする必要があります。インストール手順については、インテル® oneAPI ツールキットのインストール・ガイド (英語) を参照してください。
  3. インテル® Advisor およびインテル® C++ コンパイラー・クラシックの環境変数を設定します。例えば、インストール・ディレクトリーで setvars スクリプトを実行します。インテル® oneAPI DPC++/C++ コンパイラーの導入ガイド (英語)

    このドキュメントでは、ツールがデフォルトの場所にインストールされていることを前提としています。ツールを別の場所にインストールした場合は、以下のコマンドのデフォルトパスを必ず置き換えてください。

    重要

    環境変数を設定した後、ターミナルまたはコマンドプロンプトを閉じないでください。閉じると環境がリセットされます。

アプリケーションを展開してビルドします

Linux*

環境変数を設定したターミナルから:

  1. /opt/intel/oneapi/advisor/latest/samples/en/C++ ディレクトリーに移動します。
  2. vec_samples.tgz ファイルをシステム上の書き込み可能なディレクトリーまたは共有ディレクトリーにコピーします。
  3. .tgz アーカイブからサンプルを展開します。
  4. 展開した場所にある vec_samples/ ディレクトリーに移動します。
  5. リリースモードでサンプル・アプリケーションをビルドします。
    make baseline

    このコマンドは、-O2 -g コンパイラー・オプションを使用してアプリケーションをビルドします。アプリケーションのビルドの詳細については、ターゲット・アプリケーションのビルドを参照してください。

  6. アプリケーションを実行してビルドを確認します。
    make baseline

    アプリケーションが正常にビルドされたことを示す次のような出力が表示されます。

    ROW:47 COL: 47 Execution time is 6.020 seconds GigaFlops = 0.733887 Sum of result = 254364.540283

Windows*

環境変数を設定したコマンドプロンプトから:

  1. C:\Program Files (x86)\Intel\oneAPI\advisor\latest\samples\en\C++ ディレクトリーに移動します。
  2. vec_samples.zip ファイルをシステム上の書き込み可能なディレクトリーまたは共有ディレクトリーにコピーします。
  3. サンプルを .zip アーカイブから展開します。
  4. 展開した場所にある vec_samples\ ディレクトリーに移動します。
  5. リリースモードでサンプル・アプリケーションをビルドします。
    build.bat baseline

    スクリプトは、/O2 /Qstd=c99 /fp:fast /Isrc /Zi /Qopenmp コンパイラー・オプションを使用してアプリケーションをビルドします。アプリケーションのビルドの詳細については、ターゲット・アプリケーションのビルドを参照してください。

  6. サンプル・アプリケーションを実行してビルドを確認します。
    vec_samples.exe

    アプリケーションが正常にビルドされたことを示す次のような出力が表示されます。

    ROW:47 COL: 47 Execution time is 6.020 seconds GigaFlops = 0.733887 Sum of result = 254364.540283

パフォーマンスのベースラインを測定する

グラフィカル・ユーザー・インターフェイス (GUI) からベクトル化とコードの調査を実行

  1. 環境変数を設定したターミナルまたはコマンドプロンプトから、インテル® Advisor GUI を起動します。
    advisor-gui
  2. 先ほどビルドした vec_samples アプリケーションのプロジェクトを作成します。詳細は、始める前にを参照してください。

    [Project Properties (プロジェクトのプロパティー)] ダイアログボックスで、Trip Counts and FLOP Analysis (トリップカウントと FLOP 解析)Dependencies Analysis (依存関係解析)、およびMemory Access Patterns Analysis (メモリー・アクセス・パターン解析) の各タイプで [Inherit settings from Survey Hotspots Analysis Type (調査ホットスポット分析タイプから設定を継承する)] チェックボックスが選択されていることを確認します。

  3. [Perspective Selector (パースペクティブ・セレクター)] ウィンドウで、Vectorization and Code Insights (ベクトル化とコードの調査) パースペクティブを選択します。
  4. [Analysis Workflow (解析ワークフロー)] ペインで、データ収集の精度レベルを [Low (低)] に設定し、 ボタンをクリックしてパースペクティブを実行します。

    この精度レベルでは、インテル® Advisor は Survey (サーベイ) 分析を実行し、アプリケーションのパフォーマンス・メトリックを収集して、ベクトル化が不十分なホットスポットやベクトル化されていないホットスポットを特定します。

コマンドライン・インターフェイス (CLI) からベクトル化とコードの調査を実行

Linux* では

環境変数を設定したコマンドプロンプトから:

  1. 次のコマンドでサーベイデータを収集します。
    advisor --collect=survey --project-dir=./results -- ./vec_samples
  2. 次のコマンドでサーベイレポートを生成します。
    advisor --report=survey --project-dir=./results

    レポートのサマリーは、ターミナルまたはコマンドプロンプトに出力されます。このレポートのコピーは ./vec_samples/e000/hs000/advisor-survey.txt に保存されます。

    解析が完了すると、ベクトル化とコード調査の結果を含む vec_samples プロジェクトが自動的に作成されます。結果は、インテル® Advisor GUI で表示できます。

Windows* では

環境変数を設定したコマンドプロンプトから:

  1. 次のコマンドでサーベイデータを収集します。
    advisor --collect=survey --project-dir=./results -- vec_samples.exe
  2. 次のコマンドでサーベイレポートを生成します。
    advisor --report=survey --project-dir=./results

コマンドはターミナルまたはコマンドプロンプトに出力されます。このレポートのコピーは ./vec_samples/e000/hs000/advisor-survey.txt に保存されます。

解析が完了すると、ベクトル化とコード調査の結果を含む vec_samples プロジェクトが自動的に作成されます。結果は、インテル® Advisor GUI で表示できます。

結果を調査します

GUI を使用してデータの収集が完了するとインテル® Advisor は結果を自動的に開きます。

CLI を使用してデータを収集したら、次のコマンドを使用して GUI で結果を開きます。

advisor-gui ./results

結果が自動的に開かない場合は、[Show Result (結果を表示)] をクリックします。

GUI でベクトル化とコードの調査の結果を開くと、インテル® Advisor は最初に [Summary (サマリー)] タブを表示します。このウィンドウは、アプリケーションの実行、パフォーマンスのヒント、アプリケーションのベクトル化の問題に関する主要な情報を含むダッシュボードです。

[Summary (サマリー)] ウィンドウでは、次の点に注意してください。

  1. [Program Metrics (プログラムメトリック)] ペインの Elapsed Time (経過時間) メトリックを使用して、アプリケーションのパフォーマンスを評価します。ベクトル化が不十分な関数/ループやベクトル化されていない関数/ループを改善するたびに、このメトリックの改善につながります。パースペクティブの実行を繰り返すたびに、プログラムの経過時間が更新されることを検討してください。
  2. [Program Metrics (プログラムメトリック)] ペインでは、Time in scalar code (スカラーコードの時間) は 100% で、Vectorization Gain/Efficiency (ベクトル化ゲイン/効率) は空です。これは、アプリケーション内にベクトル化されたループが存在しないことを意味します。
  3. [Program Metrics (プログラムメトリック)] ペインでは、Vector Instruction Set (ベクター命令セット)SSE2SSE です。このメトリックは赤でハイライト表示されています。メトリック値の上にマウスを移動すると、より高度な命令セット・アーキテクチャーが利用可能であるという警告が表示されます。この警告は、[Per Program Recommendations (プログラムごとの推奨事項)] ペインにも報告されます。パフォーマンスを向上させるには、それを可能にする命令を生成するため、アプリケーションを再コンパイルすることを検討してください。
  4. [Top Time-Consuming Loops (時間を消費する上位のループペイン)] ペインで、最適化の対象となる上位のホットスポットを表示します。最大のホットスポットをクリックすると、Survey Report (サーベイレポート) で詳細なメトリックが表示されます。

[Survey & Roofline (サーベイとルーフライン)] タブに切り替えると、アプリケーション内の各ループ/関数のパフォーマンスを解析できます。

  1. 画面の左上にある [Elapsed time (経過時間)] の値。これは、以降のパフォーマンス向上を測定する際のベースラインとなります。
  2. [Type (タイプ)] カラムでは、検出されたループはすべて scalar (スカラー) です。
  3. [Why No Vectorization? (ベクトル化できない理由)] カラムには、コンパイラーが検出または想定したループのベクトル化を妨げる理由が表示されます。
  4. コンパイラーがベクトル化の依存関係を検出または想定したループの インテル® Advisor のコントロール: コンパイラー診断の詳細 コントロールをクリックすると、[Why No Vectorization? (ベクトル化されない理由)] ペインに [how-can-I-fix-this-issue? (この問題をどのように修正できますか)] 情報が表示されます。
  5. パースペクティブの実行後に表示される [Summary (サマリー)] ウィンドウを確認します。このウィンドウは、アプリケーションの実行、パフォーマンスのヒント、アプリケーションのベクトル化の問題に関する主要な情報を含むダッシュボードです。

ベースライン結果の読み取り専用スナップショットを作成する

読み取り専用の結果スナップショットを作成し、他の結果と共有したり比較することができます。それには以下を行います。

  1. インテル® Advisor のコントロール: スナップショット アイコンをクリックします。
  2. [Result (結果)] 名フィールドに ‘snapshot_baseline’ と入力します。
  3. [Result path (結果パス)] フィールドを有効にするには、[Pack into archive (アーカイブにパック)] チェックボックスをオンにします。
  4. 目的の場所を参照し、[OK] ボタンをクリックして、結果の読み取り専用スナップショットを保存します。
  5. スナップショット・プロセスが完了した後も [Survey Report (サーベイレポート)] がグレー表示のままの場合、レポートの任意の場所をクリックします。

パフォーマンスの改善を確認するには、保存された結果のスナップショットを開き、メトリックを snapshot_baseline スナップショットのメトリックと比較します。

ポインターの曖昧さ

2 つのポインターが同じメモリー位置を指す場合、2 つのポインターはエイリアスされています。エイリアス化される可能性のあるポインターを使用してメモリーに保存すると、一部の最適化が妨げられる可能性があります。例えば、ループ反復間に依存関係があると、ベクトル化の安全性が損なわれることがあります。状況によっては、コンパイラーはループがベクトル化されたバージョンとベクトル化されないバージョンの両方を生成し、実行時にエイリアシングをテストして適切なコードパスを選択できるようにします。ポインターがエイリアス化されていないことを、コンパイラーに通知すると、ランタイムチェックを回避して、単一のベクトル化されたコードパスを生成できます。

Multiply.c では、コンパイラーは、関数 matvec(FTYPE a[][COLWIDTH], FTYPE b[], FTYPE x[]) 内のポイント b が a または x のいずれかにエイリアスされているかどうかを判断するランタイムチェックを生成します。Multiply.c が NOALIAS マクロを使用してコンパイルされる場合、引数 b の restrict 修飾子は、ポインターが他のポインターとエイリアスせず、配列 b が a または x と重複しないことをコンパイラーに通知できます。

NOALIAS マクロによってパフォーマンスが向上するか確認するには、次の手順を実行します。

Linux* では

同じターミナルウィンドウから:

  1. vec_samples/ ディレクトリーに移動します。
  2. NOALIAS マクロを使用してターゲット・アプリケーションを再ビルドします。
    make noalias

    このコマンドは、次のコンパイラー・オプションを使用してアプリケーションをビルドします。
    -O2 -g -D NOALIAS

  3. ベースラインの結果と同じ構成で、GUI または CLI からベクトル化とコードの調査パースペクティブを再実行します。手順については上記のセクションを参照してください。

Windows* の場合、同じターミナルウィンドウから:

  1. vec_samples ディレクトリーに移動します。
  2. NOALIAS マクロを使用してターゲット・アプリケーションを再ビルドします。
    build.bat noalias

    このスクリプトは、次のコンパイラー・オプションを使用してアプリケーションをビルドします。
    /O2 /Qstd=c99 /fp:fast /Isrc /Zi /Qopenmp /DNOALIAS

  3. ベースラインの結果と同じ構成で、GUI または CLI からベクトル化とコードの調査パースペクティブを再実行します。手順については上記のセクションを参照してください。

結果を表示

GUI を使用してデータの収集が完了するとインテル® Advisor は結果を自動的に開きます。

CLI を使用してデータを収集したら、次のコマンドを使用して GUI で結果を開きます。

advisor-gui ./vec_samples

結果が自動的に開かない場合は、[Show Result (結果を表示)] をクリックします。

[Summary (サマリー)] ウィンドウで変更を確認します。

  1. [Program Metrics (プログラムメトリック)] ペインに、コンパイラーが 2 つのループをベクトル化したことを意味する新しいメトリック Time in 2 Vectorized Loops (2 つのベクトル化ループの時間) が表示されました。ベクトル化されたループの時間は、アプリケーション実行時間の 36.6% です。
  2. ペインの Vectorization Gain/Efficiency (ベクトル化ゲイン/効率) セクションを調べます。ループは 60% の効率でベクトル化され、スカラーバージョンと比較して 2.39 倍のスピードアップが実現されていますが、まだ改善の余地があります。アプリケーション全体は、完全なスカラーバージョンと比較して 1.51 倍スピードアップされています。
  3. [Elapsed time (経過時間)] も大幅に改善されています。

アプリケーションのパフォーマンスの変化を評価するには、[Survey & Roofline (サーベイとルーフライン)] タブを開きます。レポートでは、次の点に注意してください。

  1. コンパイラーは、matvec の Multiply.c:69 と matvec の Multiply.c:60 の 2 つのループを正常にベクトル化しました。matvec の Multiply.c:60 のループは効率が高く (99%)、推定ゲインは 3.96 倍です。  

     Multiply.c:69 の matvec の効率は低く (25%)、バーは灰色になっています。これは、達成されたベクトル化効率が元のスカラーループの効率よりも低いことを意味します。 Efficiency (効率) カラムのバーにマウスを移動すると、推定される効率の説明が表示されます。

  2. 2 つのベクトル化されたループの横にある インテル® Advisor のコントロール: データ行を展開します アイコンをクリックします。両方のループに剰余ループが存在することに注意してください。[Trips Counts (トリップカウント)] カラムセットの インテル® Advisor のコントロール: 列セットを展開します アイコンをクリックして展開します。剰余ループが存在するのは、剰余ループのトリップカウント値が VL (ベクトル長) 値の倍数ではないためです。

読み取り専用のスナップショットを作成します

インテル® Advisor のコントロール: スナップショット アイコンをクリックして、snapshot_noalias の結果を保存します。

最高レベルの命令セット・アーキテクチャー向けの命令を生成します

コンパイルされるホスト・プロセッサーで使用可能なさまざまな命令セット用のコードを生成すると、パフォーマンスが向上する可能性があります。

QxHost (Windows*) および xHost (Linux*) オプションは、コンパイルされるホスト・プロセッサーで使用可能な最高の命令セットを生成するようにコンパイラーに指示します。

QxHost および xHost オプションによってパフォーマンスが向上するか確認するには、次の手順を実行します。

Linux* では

同じターミナルウィンドウから、アプリケーションをビルドします。

  1. vec_samples/ ディレクトリーに移動します。
  2. 次のようにしてターゲット・アプリケーションを再構築します。
    make xhost

    このコマンドは、次のコンパイラー・オプションを使用してアプリケーションをビルドします。
    -g -D NOALIAS -xHost

Windows* では

同じコマンドプロンプトから:

  1. vec_samples/ ディレクトリーに移動します。
  2. 次のようにしてターゲット・アプリケーションを再構築します。
    build.bat xhost

    このスクリプトは、次のコンパイラー・オプションを使用してアプリケーションをビルドします。
    /O2 /Qstd=c99 /fp:fast /Isrc /Zi /Qopenmp /DNOALIAS /QxHost

GUI または CLI からベクトル化とコードの調査パースペクティブを実行

GUI からベクトル化とコードの調査を実行

  1. GUI からプロジェクトを開きます。
    advisor-gui .\vec_samples
  2. ベクトル化とコードの調査パースペクティブの [Analysis Workflow (解析ワークフロー)] ペインで、データ収集の精度レベルを [Medium (中)] に設定します。

    この精度レベルでは、インテル® Advisor はサーベイおよび特性評価 (トリップカウント) データを収集します。

  3. パースペクティブを実行します。

CLI からベクトル化とコードの調査を実行

Linux* では

同じターミナルウィンドウから:

  1. 次のコマンドでサーベイデータを収集します。
    advisor --collect=survey --project-dir=./results -- ./vec_samples
  2. 次のコマンドでトリップカウント・データを収集します。
    advisor --collect=tripcounts --project-dir=./results -- ./vec_samples

解析が完了すると、ベクトル化とコード調査の結果を含む vec_samples プロジェクトが自動的に作成されます。結果は、インテル® Advisor GUI で表示できます。

Windows* では

同じコマンドプロンプトから:

  1. 次のコマンドでサーベイデータを収集します。
    advisor --collect=survey --project-dir=./results -- vec_samples.exe
  2. 次のコマンドでトリップカウント・データを収集します。
    advisor --collect=tripcounts --project-dir=./results -- vec_samples.exe

解析が完了すると、ベクトル化とコード調査の結果を含む vec_samples プロジェクトが自動的に作成されます。結果は、インテル® Advisor GUI で表示できます。

結果を表示

GUI を使用してデータの収集が完了するとインテル® Advisor は結果を自動的に開きます。

CLI を使用してデータを収集したら、次のコマンドを使用して GUI で結果を開きます。

advisor-gui ./results

結果が自動的に開かない場合は、[Show Result (結果を表示)] をクリックします。

[Summary (サマリー)] の変更を確認し、[Survey Report (サーベイレポート)] を開いてアプリケーションのパフォーマンスの変化を評価します。レポートでは、次の点に注意してください。

  • [Elapsed time (経過時間)] はおそらく改善されます。

  • 上部ペインの [Vector ISA] カラムと [VL] カラムの値が変更されます。

読み取り専用のスナップショットを作成します

インテル® Advisor のコントロール: スナップショット アイコンをクリックして、snapshot_xhost の結果を保存します。

次のステップ

  1. コンパイラーによって想定されるデータの依存関係に注意し、これらの依存関係が実際のものであり、関数/ループのベクトル化を妨げていないか確認します。これを行うには、[Dependencies (依存関係)] 解析を実行し、証明された依存関係を含むループをマークし、/DREDUCTION (Windows*) および -D REDUCTION (Linux*) コンパイラー・オプションを追加してアプリケーションを再ビルドします。
  2. ベクトルコードの実行速度を大幅に低下させる問題を特定したり、コンパイラーによる自動ベクトル化を妨げる問題を排除できるようにします。これを行うには、[Memory Access Patterns (メモリー・アクセス・パターン)] 解析を実行し、問題のある関数/ループ内のメモリー・アクセス・パターンを変更します。
  3. 自動ベクトル化を支援するためデータをアライメントします。詳細は、ベクトル化の可能性を高めるデータ・アライメントを参照してください。
  4. コードを再編成してループをインライン展開し、コンパイラーが処理する変数を指示してベクトル化が安全であることを判断できるようにします。

関連情報