想定される依存関係がモデル化に影響するか確認

ループに依存関係がある場合、ループを並列実行することはできず、またほとんどの場合 GPU にオフロードすることもできません。インテル® Advisor は、次のリソースからループ伝搬依存関係に関する情報を取得します。

オフロードのモデル化パースペクティブでは、依存関係の解析はオプションですが、ループがグラフィックス処理ユニット (GPU) で実行することが有益であるか判断するため、インテル® Advisor はループの依存関係に関連する重要な情報を追加する可能性があります。

ここでは、コード内でターゲット GPU のパフォーマンスに影響する可能性があるループの依存関係を特定するために利用できるワークフローについて説明します。

: 以下のコマンドでは、コマンドを実行する前に myApplication をアプリケーションの実行可能形式へのパスと名前に置き換える必要があります。アプリケーションが引数を必要とする場合、実行可能ファイル名のにそれらを指定します。

想定される依存関係の検証

アプリケーションにどのようなタイプの依存関係があるか不明である場合、依存関係解析を行う前にオフロードのモデル化を行い、潜在的な依存関係がモデル化の結果に影響するかどうか確認して、依存関係解析を実行する必要があるかを判断します。

  1. 依存関係解析なしでオフロードのモデル化を実行します。
    • GUI から: 中精度レベルを選択し、[Analysis Workflow (解析ワークフロー)] タブのパフォーマンスのモデル化の [Assume Dependencies (依存関係を想定)] オプションを有効にします。パースペクティブを実行します。
    • CLI から: 例えば、advisor コマンドライン・インターフェイスを使用して、次の解析を実行します。
      advisor --collect=survey --project-dir=./advi_results --static-instruction-mix -- ./myApplication
      advisor --collect=tripcounts --project-dir=./advi_results --flop --stacks --enable-cache-simulation --target-device=xehpg_512xve --data-transfer=light -- ./myApplication
      advisor --collect=projection --project-dir=./advi_results
  2. 生成されたレポートを開き、[Accelerated Regions (アクセラレートされた領域)] タブに移動します。
  3. [Code Regions (コード領域)] ペインで、[Measured (測定)] カラムを拡張し、[Dependency Type (依存関係タイプ)] カラムを調べます。
    • 次の依存関係タイプのループでは、依存関係解析を行う必要はありません。
      • 並列: プログラミング・モデルの依存関係タイプは、ループが SYCL*、OpenCL*、または OpenMP* target プログラミング・モデルを使用することを意味します。
      • 並列: 明示的な依存関係タイプとは、ループが CPU 上でスレッド化またはベクトル化されていることを意味します (例えば、OpenMP* の parallel for やインテル® oneAPI スレッディング・ビルディング・ブロックの parallel for)。
      • 並列: 証明された依存関係のタイプは、インテル® コンパイラーがコンパイル時に依存関係を検出できなかったことを意味します。
    • 依存関係のあるループでは依存関係解析を行う必要があります。想定された依存関係タイプ。これは、インテル® Advisor がこれらのループのループ伝搬依存関係に関連する情報を持たず、それらをオフロードの候補としないことを意味します。
  4. 多くの依存関係が見つかった場合: 想定されたタイプでは、次のように想定された依存関係を無視してパフォーマンスのモデル化を再実行します。
    • GUI から: [Analysis Workflow (解析ワークフロー)] タブでパフォーマンスのモデル化のみを選択し、[Assume Dependencies (依存関係を想定)] オプションを無効にします。パースペクティブを実行します。
    • CLI から: 次のいずれかのオプションを使用してパフォーマンス・モデル化を実行します
      • --no-assume-dependencies は、想定されたすべてのループ/関数の依存関係を無視します。例:
        advisor --collect=projection --project-dir=./advi_results --no-assume-dependencies
      • --set-parallel=[<loop-ID1>|<file-name1>:<line1>,<loop-ID2>|<file-name2>:<line2>,...] を使用して、想定される特定のループ/関数の依存関係を無視します。一部のループ/関数に依存関係があることが判明していて、それらを parallel としてモデル化したくない場合、このオプションを使用します。例:
        advisor --collect=projection --project-dir=./advi_results --set-parallel=foo.cpp:34,bar.cpp:192
  5. 生成された結果から潜在的な依存関係によって GPU へのオフロードがブロックされる可能性があるか確認します。

    依存関係が解決されたループ: 想定された依存関係タイプは Parallel としてマークされました: 想定された。インテル® Advisor は、ターゲット GPU でのパフォーマンスをモデル化して、潜在的なオフロードの収益性とスピードアップをチェックします。

  6. スピードアップ、オフロードの数、想定されたアクセラレート時間など、依存関係を想定した場合と想定しない場合で計算されたプログラムのメトリックを比較します。
    • 比較の差が小さい場合 (例えば、依存関係があると想定した場合のスピードアップが 1.5 倍で、ないと想定した場合が 1.6 倍)、依存関係解析をスキップして現在の推定値を採用できます。この場合、潜在的な依存関係を持つほとんどのループではオフロードから収益は得られず、ターゲット GPU 上でアプリケーションのスピードアップは期待できません。
    • 比較の差が大きい場合 (例えば、依存関係があると想定した場合のスピードアップが 2 倍で、ないと想定した場合が 40 倍)、依存関係解析を実行すべきです。この場合、ループ伝搬依存に関連する情報は、パフォーマンスを正確に見積もる上で重要となります。

依存関係解析を実行

コードの実際の依存関係を確認するには、依存関係解析を実行し、パフォーマンスのモデル化を再実行して、GPU でのアプリケーションのパフォーマンスの正確な推測値を取得します。

インテル® Advisor で結果を開く、対話型 HTML レポートを表示する、またはコマンドラインで出力します。結果の調査を続行して、オフロードするコード領域を特定します。

関連情報