OpenMP* アプリケーションの解析

同カテゴリーの次の記事

Android* システム向けのリモート・パフォーマンス解析のワークフロー

この記事は、インテル® デベロッパー・ゾーンに公開されている、インテル® VTune™ Amplifier のオンラインヘルプの一部「Analyzing OpenMP* Applications」の日本語参考訳です。Windows* 用のヘルプではありますが、その他の OS 環境でも十分ご利用いただけます。また、構成は英語版のヘルプと同じ階層構造にしてあります。


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

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

  • シリアル領域の実行 (並列領域の外側): マスタースレッドがシリアル領域を実行している間、OpenMP* ランタイムのワーカースレッドは次の並列領域に向けて待機しています。
  • 負荷インバランス: あるスレッドが並列領域内のワークを完了した時に、バリアーでほかのスレッドの完了を待機する状況です。
  • 十分でない並列ワーク: ループの反復数がワーキングスレッドの数よりも少ない場合、チーム内のいくつかのスレッドは何も実行せずバリアーで待機します。
  • ロックによる同期: 並列領域内で同期オブジェクトが使用されると、ほかのスレッドとの共有リソースへのアクセス競合を避けるため、スレッドはロックが開放されるまで待機することができます。

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

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

  1. 推奨オプションを使用してコードをコンパイル。
  2. OpenMP* 領域の解析設定。
  3. アプリケーション・レベルの OpenMP* メトリックを調査。
  4. シリアルコードの特定。
  5. 潜在的なゲインの予測。
  6. ハイブリッド・アプリケーションでは、OpenMP*-MPI メトリックを関連付けます。
  7. 制限事項を理解します。

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

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

  • OpenMP* 並列領域を解析するには、インテル® コンパイラー 13.1 Update 2 以降 (インテル® Composer XE 2013 Update 2 に含まれる) でコードをコンパイルして実行します。古いバージョンの OpenMP* ランタイム・ライブラリーが検出されると、インテル® VTune™ Amplifier は警告メッセージを出力します。この場合、収集結果は不完全な可能性があります。

    ドキュメントに記載される最新の OpenMP* 解析を利用するには、常に最新バージョンのインテル® コンパイラーを使用していることを確認してください。

OpenMP* 解析の設定

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

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

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

  2. 左ペインで OpenMP* 解析をサポートする解析タイプを選択します: [Basic Hotspots (基本ホットスポット)]、[Advanced Hotspots (高度なホットスポット)]、[Concurrency (コンカレンシー)]、[HPC Performance Characterization (HPC パフォーマンス特性)]、[General Exploration (一般)]、[Memory Access (メモリーアクセス)]、または [Custom Analysis (カスタム解析)] (英語) タイプ。

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

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

    注:

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

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

OpenMP* 領域の解析は、ホストとインテル® Xeon Phi™ コプロセッサーの両方で実行することができます。

アプリケーション・レベルの 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* 領域の存続時間タイプ/…)] グループレベルとともにさらに詳しい解析に使用されます。

シリアルコードの特定

シリアル実行されたコードを解析するため、[Bottom-up (ボトムアップ)] ウインドウに切り替えて、[OpenMP Region/Thread/Function (OpenMP* 領域/スレッド/関数)] のグループを選択し、[Serial – outside any region (シリアル – すべての領域外)] でカラムの [OMP Master Thread (OMP マスタースレッド)] をフィルター処理して、利用する CPU 時間でデータをソートするため [Effective Time by Utilization (利用状況ごとの有効時間)] カラムをクリックします。

潜在的なゲインの予測

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

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

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

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

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

上記の例では、4 つの barrier-to-barrier セグメントが定義されています (ユーザー指定 のバリアー、暗黙の single バリアー、omp for ループ終端の暗黙のバリアーと、並列領域終端でのジョインの暗黙のバリアー)。

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

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

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

  • インバランス (英語): 各スレッドのワークの処理時間が異なり、バリアーで待機しています。インバランス時間が大きい場合、dynamic 型のスケジュールを検討してください。インテル® Parallel Studio XE Composer Edition に含まれるインテルの OpenMP* ランタイム・ライブラリーは、インバランスを正確にレポートし、メトリックはサンプリングをべースに計算されるほかの非効率性のように統計精度に依存しません。
  • ロック競合 (英語): スレッドは競合するロック、または "ordered" 並列ループで待機しています。ロック競合の時間が長い場合、リダクション、スレッド・ローカル・ストレージ、またはより高速なアトミック操作を使用して並列領域内の同期を排除してください。
  • 生成 (英語): 並列ワークを調整するオーバーヘッド。並列ワークを調整する時間が長い場合、並列領域を外部ループへ移動して、並列処理の粒度をより小さくすることを検討してください。
  • スケジュール (英語): 並列ワークをワーカースレッドに割り当てる OpenMP* ランタイムのオーバーヘッド。スケジュール時間が長い場合 (dynamic タイプのスケジュールでよく見られる)、大きなチャンクサイズの "dynamic" スケジュールや、"guided" タイプのスケジュールを使用してください。
  • アトミック (英語): アトミック操作における OpenMP* ランタイムのオーバーヘッド。
  • リダクション (英語): リダクション操作に費やされた時間。

[Potential Gain] カラムが、インテルの OpenMP* ランタイムが初期のバージョンであることが原因で展開できない場合、対応する CPU 時間メトリックを解析します。

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

注:

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

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

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

MPI 通信のスピン時間

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

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

制限事項

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

  • サポートされる並列領域の最大数は 512 です。これは、スコープが 512 に達すると、それ以降は並列領域に到達しても移行されないことを意味します。
  • 入れ子になった領域からの並列処理はサポートされません。トップレベルの領域のみが示されます。
  • インテル® VTune™ Amplifier は、OpenMP* ライブラリーのスタティック・リンクをサポートしていません。
最適化に関する注意事項
インテル® コンパイラーでは、インテル® マイクロプロセッサーに限定されない最適化に関して、他社製マイクロプロセッサー用に同等の最適化を行えないことがあります。これには、インテル® ストリーミング SIMD 拡張命令 2、インテル® ストリーミング SIMD 拡張命令 3、インテル® ストリーミング SIMD 拡張命令 3 補足命令などの最適化が該当します。インテルは、他社製マイクロプロセッサーに関して、いかなる最適化の利用、機能、または効果も保証いたしません。本製品のマイクロプロセッサー依存の最適化は、インテル® マイクロプロセッサーでの使用を前提としています。インテル® マイクロアーキテクチャーに限定されない最適化のなかにも、インテル® マイクロプロセッサー用のものがあります。この注意事項で言及した命令セットの詳細については、該当する製品のユーザー・リファレンス・ガイドを参照してください。

改訂 #20110804

関連項目

インテル® Xeon Phi™ コプロセッサー解析のワークフロー MPI アプリケーションの解析

コンパイラーの最適化に関する詳細は、最適化に関する注意事項を参照してください。

関連記事

  • インテル® MIC アーキテクチャー解析のワークフローインテル® MIC アーキテクチャー解析のワークフロー この記事は、インテル® デベロッパー・ゾーンに公開されている、インテル® VTune™ Amplifier のオンラインヘルプの一部「Intel® Xeon Phi™ Processor (Code Name: Knights Landing) Analysis Workflow」の日本語参考訳です。Windows* […]
  • インテル® MIC アーキテクチャー解析のワークフローインテル® MIC アーキテクチャー解析のワークフロー この記事は、インテル® デベロッパー・ゾーンに公開されている、インテル® VTune™ Amplifier のオンラインヘルプの一部「Intel® Xeon Phi™ Processor (Code Name: Knights Landing) Analysis Workflow」の日本語参考訳です。Windows* […]
  • パフォーマンス解析の設定パフォーマンス解析の設定 この記事は、インテル® デベロッパー・ゾーンに公開されている、インテル® VTune™ Amplifier のオンラインヘルプの一部「Performance Analysis Setup」の日本語参考訳です。Windows* 用のヘルプではありますが、その他の OS […]
  • FreeBSD* サポートFreeBSD* サポート この記事は、インテル® デベロッパー・ゾーンに公開されている、インテル® VTune™ Amplifier のオンラインヘルプの一部「FreeBSD* Support」の日本語参考訳です。Windows* 用のヘルプではありますが、その他の OS […]
  • 解析結果の表示 この記事は、インテル® デベロッパー・ゾーンに公開されている、インテル® VTune™ Amplifier のオンラインヘルプの一部「Viewing Analysis Results」の日本語参考訳です。Windows* 用のヘルプではありますが、その他の OS […]