インテル® VTune™ Amplifier 2018 ヘルプ

OpenMP* コードの解析

インテル® VTune™ Amplifier を使用して OpenMP* や OpenMP*-MPI ハイブリッド・アプリケーションの CPU 使用率を解析し、非効率な結果をもたらす原因を特定します。

OpenMP* は、fork-join 並列モデルであり、プログラムは単一のマスタースレッドでシリアルコードの処理を開始します。並列領域に到達すると、マスタースレッドがその領域を実行する複数のスレッドをフォークします。並列領域の終端に到達すると、スレッドは暗黙のバリアーでジョインしてマスタースレッドがシリアルコードの実行を継続します。OpenMP* プログラムを MPI プログラムのように記述することも可能です。その場合、マスタースレッドが即座に並列領域をフォークし、barriersingle のような構文をワークの調整に使用します。しかし、シリアルコードと点在する並列領域のシーケンスで構成される OpenMP* プログラムの方がより一般的です。

並列化されたアプリケーションのスレッドは、開始から終了まで CPU コアの処理時間を 100% 利用するのが理想的です。実際には、実行中のスレッドがアクティブにスピン (パフォーマンスのため、待機時間が短いことを想定) したり、パッシブに待機して CPU を利用していない状況により、CPU 使用率は少なくなります。ワーカースレッドが、有益なワークを行わず待機するのにはいくつかの理由があります。

インテル® VTune™ Amplifier は、インテル® Composer XE 2013 Update 2 以降で作成したアプリケーションが利用可能な CPU をどのように使用するかを理解し、CPU を効率良く使用していない原因を特定するのに役立ちます。

インテル® VTune™ Amplifier で OpenMP* アプリケーションを解析するには、次の操作を行います。

  1. 推奨オプションを使用してコードをコンパイルします。

  2. OpenMP* 領域の解析設定を指定します。

  3. アプリケーション・レベルの OpenMP* メトリックを調査します。

  4. シリアルコードを特定します。

  5. 潜在的なゲインを予測します。

  6. ハイブリッド・アプリケーションでは、OpenMP*-MPI メトリックを関連付けます。

  7. 制限事項を理解します。

推奨オプションを使用してコードをコンパイル

コンパイル中に並列領域とソースの解析を有効にするには、次の操作を行います。

OpenMP* 解析の設定

ターゲットの OpenMP* 解析を有効にするには、次の操作を行います。

  1. インテル® VTune™ Amplifier ツールバーの [New Analysis (新規解析)] ボタン (スタンドアロン GUI)/ (Visual Studio* IDE) をクリックします。

    [Analysis Type (解析タイプ)] 設定ウィンドウが表示されます。

  2. 左のペインで、OpenMP* 解析をサポートする解析タイプを選択します: 基本ホットスポット、高度なホットスポット、並行性、HPC パフォーマンス特性、全般解析、メモリーアクセスおよびカスタム解析タイプなど。

    右のペインは、選択した解析タイプの設定オプションで更新されます。

  3. [Analyze OpenMP regions (OpenMP* 領域を解析)] オプションをオンにします。

    HPC パフォーマンス特性解析は、デフォルトで有効になります。

インテル® コンパイラーの OpenMP* ランタイム・ライブラリーは、実行中のプロファイルに特殊なマーカーを提供するため、インテル® VTune™ Amplifier は OpenMP* 並列領域の統計を解読し、アプリケーション・コードのシリアル領域を識別することができます。

アプリケーション・レベルの OpenMP* メトリックを調査

解析ターゲットの CPU 使用率を理解するため解析を開始します。[HPC Performance Characterization viewpoint (HPC パフォーマンス特性ビューポイント)] を使用する場合、使用される論理 CPU 数とこの CPU の効率予測 (パーセント) を示す、[Summary (サマリー)] ウィンドウの [CPU Utilization (CPU 使用率)] セクションに注目します。低い CPU 使用率は、パフォーマンスの問題として示されます。

そのほかのビューポイントは、アプリケーションの経過時間を CPU 使用率レベルに細分化した [CPU Usage Histogram (CPU 使用率ヒストグラム)] を示します。ヒストグラムに表示される使用率には、アプリケーションで実際に処理を行った CPU サイクルのみがカウントされ、CPU のスピンループはカウントされません。利用可能なハードウェア・スレッドよりも少ない OpenMP* ワーカースレッドを意図して使用する場合、スライドバーを調整してデフォルトレベルを変更できます。

CPU 使用率ヒストグラム

バーが理想的な使用率に近い場合、アルゴリズムやマイクロアーキテクチャーのチューニングによるパフォーマンス改善の可能性を探すため、より詳しく調査する必要があるかもしれません。そうでなければ、アプリケーションの非効率な並列処理を見つけるため、[Summary] ウィンドウの [OpenMP Analysis (OpenMP* 解析)] セクションを調査します。

OpenMP* 解析収集時間

[Summary] ウィンドウのこのセクションは、プログラムのシリアル領域の存続時間 (並列領域外すべて) と並列領域の存続時間、および [Collection Time (収集時間)] を示しています。シリアル領域の時間が長い場合、並列性を高めるか、またはシリアル実行が避けられないアルゴリズムやマイクロアーキテクチャーをチューニングして、シリアル実行領域を最小化する方法を探します。スレッド数の多いマシンのシリアル領域は、潜在的なスケーリングに多大な影響を与えるため (アムダールの法則)、可能な限り最小化すべきです。

[Summary] ウィンドウの [OpenMP Region Duration (OpenMP* 領域の存続時間)] ヒストグラムを使用して、OpenMP* 領域のインスタンスを解析し、インスタンス存続時間の時間分布を調査して、Fast/Good/Slow 領域のインスタンスを特定します。Fast/Good/Slow カテゴリーによるデフォルトの領域インスタンスの比率は、最小から最大の領域時間値の範囲で 20/40/20 です。必要に応じてしきい値を変更します。

OpenMP* Region Duration ヒストグラム

このデータは、グリッド表示と [OpenMP Region/OpenMP Region Duration Type/... (OpenMP* 領域/OpenMP* 領域期間タイプ/...)] のグループ化レベルとともにさらに詳しい解析に使用されます。

シリアルコードを特定

シリアル実行されたコードを解析するため、[Summary] ウィンドウの [Serial Time (outside parallel regions) (シリアル時間 (並列領域外))] セクションを展開し、[Top Serial Hotspots (outside parallel regions) (上位のホットスポット (並列領域外))] を確認します。詳細を表示するには、[Bottom-up (ボトムアップ)] ウィンドウの関数名をクリックします。

潜在的なゲインを予測

コードの並列領域の CPU 利用効率を推測するため、[Potential Gain (潜在的なゲイン)] メトリックを使用します。このメトリックは、実際の測定と並列領域の理想化された実行との経過時間の差を推測します。理想化では、完全にバランスの取れたスレッドと、ワークの調整に OpenMP* ランタイムのオーバーヘッドがないことを仮定します。このデータは、並列実行を改善することで節約できる最大時間を理解するために使用します。

[Summary] ウィンドウは、潜在的なゲインメトリック値が最も高い並列領域の上位 5 つの詳細なテーブルを表示します。それぞれの並列領域は、#omp parallel プラグマで定義され、このメトリックは並列領域のすべてのインスタンスの潜在的なゲインの合計を示します。

潜在的なゲインが上位の OpenMP* 領域

領域の潜在的なゲインが高い場合、領域名のリンクを選択して [Bottom-up] ウィンドウで [OpenMP Region/OpenMP Barrier-to-Barrier Segment/... (OpenMP* 領域/OpenMP* バリアーからバリアーへのセグメント/...)] で分類されるグループに切り替えて、バリアーなどのメトリックによる非効率性を詳しく解析することができます。

インテル® Parallel Studio XE で提供されるインテルの OpenMP* ランタイムは、インテル® VTune™ Amplifier 向けにバリアーをインストルメントします。インテル® VTune™Amplifier は、領域のフォークからの長さ、または以前のバリアーからバリアーへのセグメントを定義する barrier-to-barrier (バリアーからバリアー) への OpenMP* 領域セグメントの概念を導入しています。

上記の例では、4 つの barrier-to-barrier セグメントが定義されています: user バリアー、暗黙の single バリアー、omp for ループ終端の暗黙のバリアー、region join バリアー。

OpenMP* 領域が複数のバリアーを持つ場合、並列ループや #pragma single セクションの暗黙のバリアーか、ユーザー指定の明示的な #pragma omp barrier かに関係なく、特定の構文やバリアーの非効率メトリックへの影響を解析します。

バリアーのタイプはセグメント名に埋め込まれます。例えば、loopsinglereduction など。また、暗黙のバリアーを持つ並列ループ向けに、ループのスケジュール、チャンクサイズ、ループ反復の最小/最大/平均数などの、インバランスやスケジュールのオーバーヘッドを理解するのに有用な追加情報をもたらします。ループ反復数の情報は、外部ループを並列化したことで反復数が少なくなり、ワーカースレッドを使い切れていない問題を特定するのに役立ちます。その場合、内側のループを並列化したり、"collapse" 節を使用してワーカースレッドを飽和状態にすることを検討します。

潜在的なゲインの内訳を OpenMP* スレッド数で正規化された非効率性のコスト (経過時間) で示した [Potential Gain (潜在的なゲイン)] 列のデータを解析します。経過時間のコストは、特定のタイプの非効率性に注目すべきか判断するのに役立ちます。インテル® VTune™ Amplifier は、次のような非効率性の識別が可能です。

古いバージョンのインテルの OpenMP* ランタイムでは、[Potential Gain] 列を展開できないため、対応する CPU 時間メトリックを解析します。

パフォーマンス上重要な OpenMP* 並列領域のソースを解析するには、[OpenMP Region/... (OpenMP* 領域/...)] グループレベルでソートをされた、グリッドの領域識別子をダブルクリックします。インテル® VTune™ Amplifier は、インテル® コンパイラーによって生成された疑似関数内で選択された OpenMP* 領域の最初で [Source (ソース)] 表示を開きます。

デフォルトでは、インテル® コンパイラーは、領域名にソースファイル名を追加しません。そのため、OpenMP* 並列領域名には [Unknown]の文字列が表示されます。領域名に対応するソースファイル名を取得するには、コンパイル時に -parallel-source-info=2 オプションを使用します。

ハイブリッド OpenMP*-MPI アプリケーション向けのメトリックを解析

OpenMP* 領域を持つプロセスを複数含む MPI 解析の結果では、[Summary] ウィンドウに MPI 実行のクリティカル・パスを持つ上位のプロセスと、プロセスごとに集計されたシリアル時間および OpenMP* の潜在的なゲインが表示されます。

MPI 通信のスピン時間

プロセス名をクリックして、[Bottom-up] ウィンドウで [Process/OpenMP Region/... (プロセス/OpenMP* 領域/...)] レベルのグループ化を選択して、MPI ランクにおける OpenMP* の非効率性に関する詳細を取得します。

領域内の複数の同期オブジェクト (例えば、#pragma omp critical) の影響を調査するには、事前定義されているロックと待機解析タイプを使用します。ロックと待機解析は、同期オブジェクト関数のトレースをベースにしており、同期オブジェクトにおける長い競合は、大きなランタイム・オーバーヘッドの原因となります。可能であれば OpenMP* のリダクション、またはスレッド・ローカル・ストレージを使用して、領域内での同期を排除することを検討します。

制限事項

インテル® VTune™ Amplifier は OpenMP* 並列領域の解析をサポートしますが、次のような制限があります。

最適化に関する注意事項

インテル® コンパイラーでは、インテル® マイクロプロセッサーに限定されない最適化に関して、他社製マイクロプロセッサー用に同等の最適化を行えないことがあります。これには、インテル® ストリーミング SIMD 拡張命令 2、インテル® ストリーミング SIMD 拡張命令 3、インテル® ストリーミング SIMD 拡張命令 3 補足命令などの最適化が該当します。インテルは、他社製マイクロプロセッサーに関して、いかなる最適化の利用、機能、または効果も保証いたしません。本製品のマイクロプロセッサー依存の最適化は、インテル® マイクロプロセッサーでの使用を前提としています。インテル® マイクロアーキテクチャーに限定されない最適化のなかにも、インテル® マイクロプロセッサー用のものがあります。この注意事項で言及した命令セットの詳細については、該当する製品のユーザー・リファレンス・ガイドを参照してください。

改訂 #20110804

関連情報