ループに依存関係がある場合、ループを並列実行することはできず、またほとんどの場合 GPU にオフロードすることもできません。インテル® Advisor は、次のリソースからループ伝搬依存関係に関する情報を取得します。
インテル® コンパイラーの診断を使用する。一部のループの依存関係はコンパイル時に検出され、その診断はインテル® コンパイラーとの統合機能を使用してインテル® Advisor に渡されます。
アプリケーションの呼び出しツリーを解釈します。ループが CPU 上で並列化またはベクトル化されている場合、またはすでに GPU にオフロードが指示されているが CPU 上で実行されている場合、インテル® Advisor はループを並列化またはオフロードする前に、ループの依存関係は解決されていると想定します。
依存関係解析の結果を使用します。この解析で実行時のループの依存関係はほとんど検出されますが、結果はアプリケーションのワークロードに依存します。高いオーバーヘッドが課せられ、解析中のアプリケーションの実行は 5 から 100 倍遅くなります。オーバーヘッドを軽減するには、対象のループをマークアップするなどいくつかの方法があります。
オフロードのモデル化パースペクティブでは、依存関係の解析はオプションですが、ループがグラフィックス処理ユニット (GPU) で実行することが有益であるか判断するため、インテル® Advisor はループの依存関係に関連する重要な情報を追加する可能性があります。
ここでは、コード内でターゲット GPU のパフォーマンスに影響する可能性があるループの依存関係を特定するために利用できるワークフローについて説明します。
注: 以下のコマンドでは、コマンドを実行する前に myApplication をアプリケーションの実行可能形式へのパスと名前に置き換える必要があります。アプリケーションが引数を必要とする場合、実行可能ファイル名の後にそれらを指定します。
アプリケーションにどのようなタイプの依存関係があるか不明である場合、依存関係解析を行う前にオフロードのモデル化を行い、潜在的な依存関係がモデル化の結果に影響するかどうか確認して、依存関係解析を実行する必要があるかを判断します。
advisor --collect=survey --project-dir=./advi_results --static-instruction-mix -- ./myApplicationadvisor --collect=tripcounts --project-dir=./advi_results --flop --stacks --enable-cache-simulation --target-device=xehpg_512xve --data-transfer=light -- ./myApplicationadvisor --collect=projection --project-dir=./advi_resultsadvisor --collect=projection --project-dir=./advi_results --no-assume-dependenciesadvisor --collect=projection --project-dir=./advi_results --set-parallel=foo.cpp:34,bar.cpp:192依存関係が解決されたループ: 想定された依存関係タイプは Parallel としてマークされました: 想定された。インテル® Advisor は、ターゲット GPU でのパフォーマンスをモデル化して、潜在的なオフロードの収益性とスピードアップをチェックします。
コードの実際の依存関係を確認するには、依存関係解析を実行し、パフォーマンスのモデル化を再実行して、GPU でのアプリケーションのパフォーマンスの正確な推測値を取得します。
デフォルトでは汎用マークアップによって収益性の高いループのみが選択されて依存関係解析が実行されます。
advisor --collect=dependencies --select markup=gpu_generic --loop-call-count-limit=16 --filter-reductions --project-dir=./advi_results -- ./myApplicationadvisor --collect=projection --project-dir=./advi_results インテル® Advisor で結果を開く、対話型 HTML レポートを表示する、またはコマンドラインで出力します。結果の調査を続行して、オフロードするコード領域を特定します。