インテル® コンパイラーでコンパイルされた OpenMP* アプリケーションの解析に、インテル® VTune™ プロファイラーのコマンドライン・インターフェイスを使用します。
要件:
OpenMP 並列領域を解析するには、必ずインテル® oneAPI DPC++/C++ コンパイラーのバージョン 2023.2.0 (またはそれ以降) を使用してコードをコンパイルして実行してください。古いバージョンの OpenMP* ランタイム・ライブラリーが検出されると、インテル® VTune™ プロファイラーは警告メッセージを出力します。この場合、収集結果は不完全です。
ドキュメントに記載される最新の OpenMP* 解析オプションを使用するには、常に最新バージョンのインテル® コンパイラーを使用していることを確認してください。
Linux* 上で、GCC* でコンパイルされた OpenMP* アプリケーションを解析するには、GCC OpenMP* ライブラリー (libgomp.so) にシンボル情報が含まれていることを確認してください。これを確認するには、libgomp.so を検索して nm コマンドでシンボルをチェックします。次に例を示します。
nm libgomp.so.1.0.0
ライブラリーにシンボル情報が含まれない場合、シンボル付きの新しいライブラリーをインストールするか、ライブラリーをコンパイルしてデバッグ情報を生成してください。例えば、Fedora* ではyumリポジトリーから GCC デバッグ情報をインストールできます。
yum install gcc-debuginfo.x86_64
OpenMP* はフォーク・ジョイン並列モデルであり、OpenMP* プログラムは単一のマスタースレッドでシリアルコードの実行を開始します。並列領域に到達すると、マスタースレッドは複数のスレッドにフォークして並列領域を実行します。各スレッドは並列領域の最後にあるバリアでジョインして、その後マスタースレッドがシリアルコードの実行を続行します。MPI プログラムのように、マスタースレッドが直ちに並列領域にフォークし、barrier や single などの構造でワークを調整する OpenMP* プログラムを記述することもできます。しかし、シリアルコードが点在する並列領域のシーケンスで構成される OpenMP* プログラムの方が一般的です。
理想的には、並列化されたアプリケーションは利用可能な CPU コアの処理時間を 100% 利用して、実行開始から終了まで有用なワークを実行するワーカースレッドを持ちます。ワーカースレッドがアクティブスピンで待機している場合 (待機時間は短いことが予想されます)、または受動的に待機して CPU を消費していない場合は、有効な CPU 利用率は低くなります。ワーカースレッドが待機し、有用なワークを実行していない理由はいくつかあります。
シリアル領域の実行 (並列領域外): マスタースレッドがシリアル領域を実行している場合、ワーカースレッドは OpenMP* ランタイムで次の並列領域を待機しています。
ロード・インバランス: スレッドは並列領域でワークロードの実行を終了すると、ほかのスレッドが終了するのをバリアで待機します。
並列ワーク不足: ループの反復回数がワーカースレッド数よりも少ないため、チームのいくつかのスレッドはバリアで待機しており、有効なワークを実行していません。
ロックでの同期: 並列領域内で同期オブジェクトが使用されると、ほかのスレッドとの共有リソースへのアクセス競合を避けるため、スレッドはロックが解放されるまで待機します。
インテル® VTune™ プロファイラーを使用して、アプリケーションが利用可能な CPU をどのように利用しているかを理解し、CPU が十分に利用されていない原因を特定します。
コマンドラインから OpenMP* 解析を実行するには、threading または hpc-performance 解析タイプを使用します。次に例を示します:
vtune -collect hpc-performance -- myApp
HPC パフォーマンス特性は、OpenMP* メトリックと検出されたパフォーマンスの問題の説明を含むサマリーレポートを生成します。
スレッド化と HPC パフォーマンス解析を実行します (OpenMP* 解析はデフォルトで有効になります)。また、カスタム解析を作成して、knob オプション analyze-openmp=true を明示的に指定できます:analyze-openmp=true 。次に例を示します:
vtune -collect-with runsa -knob analyze-openmp=true -knob enable-user-tasks=true -- myApp
データ収集が完了すると、インテル® VTune™ プロファイラーは自動的にサマリーレポートを生成します。GUI で利用可能な [サマリー] ウィンドウと同様に、サマリーレポートはターゲット全体のパフォーマンス・データを提供します。
コマンドラインから既存の結果のレポートを生成するには、次のコマンドを使用します。
vtune -report summary -result-dir <result_path>
HPC パフォーマンス特性解析では、コマンドライン・サマリー・レポートに、事前定義されたしきい値を超えるメトリックに対する問題の説明が示されます。サマリーレポートに関連する問題をスキップしたい場合、以下のいずれかの操作を行います。
レポートを生成するには、-report-knob show-issues=falseオプションを使用します。例:vtune -report summary -r r001hpc -report-knob show-issues=false
レポートを CSV 形式で表示するには、-format=csv オプションを使用します。例:vtune -report summary -r r001hpc -format=csv
アプリケーションの非効率な並列化については、サマリーレポートの OpenMP* 解析セクションを調査します。
Serial Time: 0.069s (0.3%) Parallel Region Time: 23.113s (99.7%) Estimated Ideal Time: 14.010s (60.4%) OpenMP Potential Gain: 9.103s (39.3%) | The time wasted on load imbalance or parallel work arrangement is | significant and negatively impacts the application performance and | scalability. Explore OpenMP regions with the highest metric values. | Make sure the workload of the regions is enough and the loop schedule | is optimal.
このセクションには、シリアル領域 (並列領域外) とプログラムの並列領域の持続時間と収集時間が表示されます。シリアル領域が長い場合、さらに並列処理を導入するか、並列化が困難なシリアル領域ではアルゴリズムやマイクロアーキテクチャーのチューニングを行って、シリアル実行を短縮することを検討してください。スレッド数の多いマシンのシリアル領域は、潜在的なスケーリングに深刻な悪影響を与えるため (アムダールの法則)、可能な限り最小にすべきです。
コードの並列領域で CPU 利用率の効率を予測するには、潜在的なゲインメトリックを使用します。このメトリックは、並列領域の実測された経過時間と理想化された経過時間 (スレッドのバランスが完璧で OpenMP* ランタイムのオーバーヘッドがゼロであると仮定) の差を予測します。このデータを使用して、並列実行を改善することで短縮できる最大時間を見積ることができます。
最もホットなプログラム単位を特定するには、hotspots レポートを使用します。次のコマンドを使用して、潜在的ゲインのメトリック値が最も高い 5 つの並列領域を表示します。
vtune -report hotspots -result-dir r001hpc -group-by=region -sort-desc="OpenMP Potential Gain:Self" -column="OpenMP Potential Gain:Self" -limit 5
説明:
上記のコマンドは次の出力を生成します。
OpenMP Region OpenMP Potential Gain ---------------------------------------------------------------- --------------------- compute_rhs_$omp$parallel:24@/root/work/apps/OMP/SP/rhs.f:17:433 3.417s x_solve_$omp$parallel:24@/root/work/apps/OMP/SP/x_solve.f:27:315 0.920s z_solve_$omp$parallel:24@/root/work/apps/OMP/SP/z_solve.f:31:321 0.913s y_solve_$omp$parallel:24@/root/work/apps/OMP/SP/y_solve.f:27:310 0.806s pinvr_$omp$parallel:24@/root/work/apps/OMP/SP/pinvr.f:20:41 0.697s
特定の領域の潜在的なゲインが大きい場合、バリアの影響によるインバランスなどの非効率性を示すメトリックを詳しく解析します。次のコマンドを使用します。
vtune -report hotspots -result-dir r001hpc -group-by=region,barrier -sort-desc="OpenMP Potential Gain:Self" -column="OpenMP Potential Gain" -limit 5
説明:
上記のコマンドは、次のデータを含む出力を生成します。
OpenMP* 領域 | OpenMP* バリアからバリアへのセグメント | OpenMP* 潜在的なゲイン | OpenMP* 潜在的なゲイン: インバランス | OpenMP* 潜在的なゲイン: ロック競合 | OpenMP* 潜在的なゲイン: 生成 | OpenMP* 潜在的なゲイン: スケジュール |
---|---|---|---|---|---|---|
compute_rhs_$omp$parallel:24@/root/work/OMP/SP/rhs.f:17:433 | compute_rhs_$omp$loop_barrier_segment@/root/work/OMP/SP/rhs.f:285 | 0.985s | 0.982s | 0s | 0s | 0.000s |
x_solve_$omp$parallel:24@/home/root/work/OMP/SP/x_solve.f:27:315 | x_solve_$omp$loop_barrier_segment@/root/work/OMP/SP/x_solve.f:315 | 0.920s | 0.904s | 0.012s | 0.000s | 0.000s |
z_solve_$omp$parallel:24@/root/work/OMP/SP/z_solve.f:31:321 | z_solve_$omp$loop_barrier_segment@/root/work/OMP/SP/z_solve.f:321 | 0.913s | 0.910s | 0.000s | 0.000s | 0.000s |
y_solve_$omp$parallel:24@/root/work/OMP/SP/y_solve.f:27:310 | y_solve_$omp$loop_barrier_segment@/root/work/OMP/SP/y_solve.f:310 | 0.806s | 0.803s | 0.000s | 0.000s | 0.000s |
OpenMP* スレッド数で正規化した非効率なコスト (経過時間) を表示することで、その領域の潜在的なゲインの内訳を示す [OpenMP* 潜在的なゲイン] カラムのデータを解析します。経過時間コストは、特定の非効率性タイプに対応すべきかどうかを判断するのに役立ちます。インテル® VTune™ プロファイラーは、次の非効率性タイプを認識できます。
インバランス: スレッドは異なる時間でワークを終え、バリアで待機しています。インバランス時間が顕著である場合、動的なスケジュールの導入を検討してください。インテル® Parallel Studio XE Composer Edition の OpenMP* ランタイム・ライブラリーはインバランスを正確にレポートし、メトリックはサンプリングに基づいて計算されるほかの非効率性のように統計の精度に依存しません。
ロック競合: スレッドは、競合するロック、または "ordered" が指定された並列ループで待機しています。ロック競合の時間が顕著である場合、リダクション操作、スレッド・ローカル・ストレージ、または低コストのアトミック操作を使用することで、並列構造内での同期を回避してください。
生成: 並列ワークをアレンジするオーバーヘッド。並列ワークの配置時間が顕著である場合、並列領域を外部ループに移動して、並列処理の粒度を粗くしてください。
スケジュール: ワーカースレッドに並列ワークを割り当てる OpenMP* ランタイム・スケジューラーのオーバーヘッド。スケジュールの時間が顕著である場合 (動的スケジュールで見られます)、大きなチャンクサイズの "dynamic" スケジュール、または "guided" スケジュールを使用します。
アトミック: アトミック操作を実行する OpenMP* ランタイムのオーバーヘッド。
リダクション: リダクション操作で費やされた時間。
インテル® VTune™ プロファイラーの並列 OpenMP* 領域の解析には、次のような制限があります。
サポートされる語彙的な並列領域の最大数は 512 です。512 個を超える並列領域にスコープが到達すると、並列アノテーションは出力されません。
入れ子になった並列領域はサポートされません。最上位の項目のみが並列領域を生成します。
インテル® VTune™ プロファイラーは、静的にリンクされた OpenMP* ライブラリーをサポートしません。