コマンドラインから OpenMP* 解析

インテル® コンパイラーでコンパイルされた OpenMP* アプリケーションの解析に、インテル® VTune™ プロファイラーのコマンドライン・インターフェイスを使用します。

必要条件:

OpenMP* はフォーク・ジョイン並列モデルであり、OpenMP* プログラムは単一のマスタースレッドでシリアルコードの実行を開始します。並列領域に到達すると、マスタースレッドは複数のスレッドにフォークして並列領域を実行します。各スレッドは並列領域の最後にあるバリアでジョインして、その後マスタースレッドがシリアルコードの実行を続行します。MPI プログラムのように、マスタースレッドが直ちに並列領域にフォークし、barriersingle などの構造でワークを調整する OpenMP* プログラムを記述することもできます。しかし、シリアルコードが点在する並列領域のシーケンスで構成される OpenMP* プログラムの方が一般的です。

理想的には、並列化されたアプリケーションは利用可能な CPU コアの処理時間を 100% 利用して、実行開始から終了まで有用なワークを実行するワーカースレッドを持ちます。ワーカースレッドがアクティブスピンで待機している場合 (待機時間は短いことが予想されます)、または受動的に待機して CPU を消費していない場合は、有効な CPU 利用率は低くなります。ワーカースレッドが待機し、有用なワークを実行していない理由はいくつかあります。

インテル® 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 パフォーマンス特性解析では、コマンドライン・サマリー・レポートに、事前定義されたしきい値を超えるメトリックに対する問題の説明が示されます。サマリーレポートに関連する問題をスキップしたい場合、以下のいずれかの操作を行います。

アプリケーションの非効率な並列化については、サマリーレポートの 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™ プロファイラーは、次の非効率性タイプを認識できます。

制限事項

インテル® VTune™ プロファイラーの並列 OpenMP* 領域の解析には、次のような制限があります。

関連情報