インテル® VTune™ プロファイラー・ユーザーガイド
インテル® コンパイラーでコンパイルされた OpenMP* アプリケーションの解析に、インテル® VTune™ プロファイラーのコマンドライン・インターフェイスを使用します。
必要条件:
OpenMP* 並列領域を解析するには、インテル® コンパイラー 13.1 Update 2 以降 (インテル® Composer XE 2013 Update 2 に含まれます) でコードがコンパイルされていることを確認してください。古いバージョンの 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* プログラムが単一のマスター・シリアルコードのスレッドで実行開始するフォーク・ジョイン・モデルを導入しています。並列領域に到達すると、スレッドは並列領域を実行する複数のスレッドにフォークします。並列領域の終わりで各スレッドはバリアでジョインして、マスタースレッドがシリアルコードの実行を続行します。マスタースレッドが並列領域にフォークし、barrier や single などの構造でワークを調整する、MPI プログラムのように OpenMP* プログラムを記述することもできます。しかし、OpenMP* プログラムでは、シリアルコードが点在する並列領域のシーケンスで構成される方が一般的です。
理想的な並列アプリケーションでは、実行開始から終了までワーカースレッドが有効なワークを実行して、利用可能な CPU コアの処理時間を 100% 利用します。実際には、ワーカースレッドがアクティブにスピンしたり (この場合、短い待機時間が想定されます)、CPU を消費せずに受動的に待機することで、有効な CPU 利用率は低くなります。ワーカースレッドが待機し、有効なワークを実行しない理由はいくつかあります。
シリアル領域の実行 (並列領域外): マスタースレッドがシリアル領域を実行している間、ワーカースレッドは OpenMP* ランタイムで次の並列領域を待機しています。
ロード・インバランス: スレッドは並列領域でワークロードの実行を終了すると、他のスレッドが終了するのをバリアで待機します。
並列ワーク不足: ループの反復回数がワーカースレッド数よりも少ないため、チームのいくつかのスレッドはバリアで待機して有効なワークを実行していません。
ロックでの同期: 並列領域内で同期オブジェクトが使用されると、ほかのスレッドとの共有リソースへのアクセス競合を避けるため、スレッドはロックが開放されるまで待機します。
インテル® Composer XE 2013 Update 2 以降のバージョンでインテル® VTune™ プロファイラーを使用すると、アプリケーションが利用可能な CPU をどのように利用しているか理解し、CPU が未使用である原因を特定できます。
コマンドラインから OpenMP* 解析を実行するには、threading または hpc-performance 解析タイプを使用します。次に例を示します。
vtune -collect hpc-performance -- myApp
HPC パフォーマンス特性は、OpenMP* メトリックと検出されたパフォーマンスの問題の説明を含むサマリーレポートを生成します。
スレッド化および HPC パフォーマンス特性解析タイプでは、OpenMP* 解析オプションがデフォルトで有効になります。また、カスタム解析を作成し、knob オプション 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* ライブラリーをサポートしません。