ハードウェア・イベントベースのスタック・サンプリングでアプリケーションのパフォーマンスを解析

同カテゴリーの次の記事

スタックとハードウェア・イベントベース・サンプリング収集

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


インテル® VTune™ Amplifier は、スタック収集を有効にしたハードウェア・イベントベースのサンプリングを使用して、コードの並列性と電力消費を解析する仕組みを提供します。インテル® VTune™ Amplifier のプロジェクトを作成して、解析ターゲットを設定すると、次のステップに従ってデータを収集し解析することができます。

  1. 解析の設定と実行。
    インテル® VTune™ Amplifier は、ターゲットを実行してハードウェア・イベントベースのスタック・サンプリングでデータを収集し、結果を開きます。
  2. パフォーマンス解析。
  3. 並列性の調査。

解析の設定

  1. インテル® VTune™ Amplifier ツールバーの [New Analysis (新規解析)] ボタン をクリックします。
    [Analysis Type (解析タイプ)] 設定ウィンドウが表示されます。
  2. 左ペインの解析ツリーから、必要なイベントベース・サンプリング解析タイプを選択します。一般的に、[Advanced Hotspots (高度なホットスポット)] 解析から開始することが推奨されます。
    右のペインは、選択した解析タイプの設定オプションで更新されます。
  3. 解析オプションを設定します。
    • 高度なホットスポット解析で、[Hotspots and stacks (ホットスポットとスタック)] (推奨) または、[Hotspots, call counts and stacks (ホットスポット、呼び出しカウントとスタック)] 収集レベルを選択します。
    • その他のハードウェア・イベントベース・サンプリング解析タイプでは、[Collect stacks (スタックを収集)] チェックボックスをオンにします。
  4. 右にある [Start (開始)] ボタンをクリックして、選択した解析タイプを実行します。
    インテル® VTune™ Amplifier は、実行パスの情報とともにハードウェア・イベントベースのサンプリング・データを収集します。収集された結果は、[Hardware Events viewpoint (ハードウェア・イベント・ビューポイント)] で見ることができ、呼び出しパスで検出されたパフォーマンス、並列性、および電力消費データが提供されます。

注:

  • [Estimate call counts (呼び出しカウントの推測)] チェックボックスをオンにして、サンプルされた関数への呼び出し回数を統計的に近似できます。
  • イベントベース・スタック・サンプリングは、システム全体の収集に設定することはできません。起動またはアタッチするアプリケーションを指定する必要があります。
  • コールスタック解析を行うと、データ収集のオーバーヘッドが増えます。スタックサイズによるオーバーヘッドを最小化するため、カスタム・ハードウェア・イベントベース・サンプリング設定[Stack size (スタックサイズ)] オプションを使用するか、CLI で -stack-size オプションを指定して、スタックサイズを制限します。デフォルトでは、すべてのスタックが収集されます。このオプションを無効にすると、オーバーヘッドは軽減されますが、スタックデータは収集されなくなります。

データの収集

マルチタスク・オペレーティング・システムは、すべてのソフトウェア・スレッドを時分割で実行します (スレッド実行のクアンタム)。インテル® VTune™ Amplifier のプロファイラーは、スレッドクアンタムの切り替えを識別することができ、スレッドクアンタムの配置に関連するすべての操作を監視します。

次の図はスレッドごとのクアンタム監視の概念を示します。

  • プロファイラーは、スレッドがプロセッサーにスケジュールされたとき、そして完了したときに (スレッドクアンタムの境界で) 制御を取得します。これによりプロファイラーは、スレッドがアクティブまたはインアクティブになったポイントまでのコールスタック収集に加えて、ハードウェア・パフォーマンス・イベントやタイムスタンプの正確な測定が可能になります。
  • プロファイラーは、スレッドがインアクティブになった理由を判断します: 明示的な同期要求 (上記の例のようにスレッド 0 が WaitForSingleObject 関数を呼び出した場合)、またはスレッドクアンタムの終了 (オペレーティング・システムのスケジューラーが現在のスレッドをほかのスレッドへ切り換えた場合) のいずれか。
  • スレッドがインアクティブである時間とその理由も区別されます。同期が原因のインアクティブ状態は待機時間と呼ばれ、プリエンプションが原因である場合はインアクティブ時間と呼ばれます。

スレッドがプロセッサー上でアクティブである間 (クアンタム期間内)、プロファイラーはイベントベース・サンプリングを使用します。プログラムロジックと関連するハードウェア・イベント、およびプログラムコードとそのほかの特性を再構成します。通常のイベントベース・サンプリングとは異なり、プロファイラーは各サンプリング割り込みの間も以下を収集します。

  • コールスタック情報
  • 分岐情報 (設定されている場合)
  • プロセッサーのタイムスタンプ

これらすべては、統計的にプログラムの実行ロジック (呼び出しと制御フローグラフ) を再構成し、スレッドのアクティビティーを時系列にトレースするとともに、ハードウェア利用とパフォーマンスに関連するすべての情報の収集を許可します。

注:

コールスタック解析を行うと、データ収集のオーバーヘッドが増えます。スタックサイズによるオーバーヘッドを最小化するため、カスタム・ハードウェア・イベントベース・サンプリング設定[Stack size (スタックサイズ)] オプションを使用するか、CLI で -stack-size オプションを指定して、スタックサイズを制限します。デフォルトでは、すべてのスタックが収集されます。このオプションを無効にすると、オーバーヘッドは軽減されますが、スタックデータは収集されなくなります。

パフォーマンス解析

[Hardware Events viewpoint] を選択し、[Event Count (イベントカウント)] タブをクリックします。デフォルトでは、グリッドのデータは、Clockticks (CPU_CLK_UNHALTED) イベントカウントでソートされ、主要なホットスポットがリスト上位に表示されます。

それぞれのホットスポット項目 (デフォルトでは関数) を展開し、ホットスポットが実行された一連の呼び出しパスを表示するには、「+」 マークをクリックします。インテル® VTune™ Amplifier は、パスが実行された頻度を基に、呼び出しパスごとのハードウェア・イベントを分解します。

Hardware Events Viewpoint (ハードウェア・イベント・ビューポイント): 呼び出しパスごとのイベントカウント

サンプルされたノードに至るすべての実行パスのハードウェア・イベントのカウントが、そのノードのイベントカウントに合計されます。例えば、_schedule 関数はアプリケーションにおける最も上位のホットスポットですが、INST_RETIRED.ANY イベントカウントは 7 つの呼び出しシーケンスの合計と等しくなっています: 22 657 490 276 = 20 377 044 + 5 269 274 +0 + 718 190 701 + 21 857 068 455 + 26 565 167 + 30 019 635。

ホットスポットがサードパーティーのライブラリー関数の中にあるためコードを変更できない、または振る舞いが入力パラメーターに依存する場合、このような分解は非常に重要です。この場合、最適化の唯一の方法は呼び出し元を解析して、過度な関数呼び出しを排除するか、パフォーマンスを大幅に低下させる引数や条件を知ることです。

並列性の調査

コールスタック収集を有効にすると、インテル® VTune™ Amplifier はコンテキスト・スイッチを解析し、コンテキスト・スイッチ・パフォーマンス・メトリックとしてデータをスレッドのアクティビティーに表示します。

[Synchronization Context Switches (同期コンテキスト・スイッチ)] カラムのヘッダーをクリックすると、このメトリックでソートできます。コンテキスト・スイッチ数が最も多く、待機時間が長い同期ホットスポットは、このスタック上でスレッド競合が発生していることを示します。

Hardware Events Viewpoint (ハードウェア・イベント・ビューポイント): コンテキスト・スイッチ

[Call Stack (コールスタック)] ペインのドロップダウン・メニューでコンテキスト・スイッチが原因のスタックタイプを選択 ([Preemption Context Switches (プリエンプション・コンテキスト・スイッチ)] など) して、[Timeline (タイムライン)] ペインに表示されるそれぞれのスレッド実行のクアンタムを調査します。濃い緑のバーは単一のスレッド・アクティビティーのクアンタム、灰色のバーと薄い緑のバーは、スレッドがインアクティブ状態 (コンテキスト・スイッチ) の範囲を示します。[Timeline] ペインのコンテキスト・スイッチ領域で、マウスをホバーすると、その存続期間、開始時間、およびスレッドがインアクティブな理由が表示されます。

Hardware Events Viewpoint (ハードウェア・イベント・ビューポイント): スレッド・アクティビティー

[Timeline] ペインでコンテキスト・スイッチ領域を選択すると、[Call Stack] ペインにクアンタムが割り込みされた呼び出しシーケンスが表示されます。

また、[Timeline] ドロップダウン・メニューからハードウェア、またはソフトウェア・イベントを選択して、イベントがスレッドのアクティビティーにどのように分布されているか見ることができます。

パフォーマンスと並列処理の解析中にデータを関連付けることができます。イベントカウントが最も多いパフォーマンス・ホットスポットや、同期ホットスポットとしてリストされる実行パスは、最適化の明白な候補です。次のステップは、電力の観点から同期方式などのコストを理解するため、電力関係のメトリックを解析することです。

注:

データが生成される速度 (サンプリングの頻度とスレッド同期/競合の強度に比例) は、データがトレースファイルに保存される速度よりも大きくなる可能性があります。そのため、プロファイラーは、プロファイル中のプログラムのスレッドがスケジュールされないようにすることで、受信データレートと送信データレートを合わせようとします。これにより、ポーズが明示的に要求されていない場合でも、タイムライン上にポーズされた範囲が示されます。極端なケースでは、この手順で受信データレートの制限に失敗した場合、プロファイラーはサンプルレコードを失いますが、ハードウェア・イベントのカウントは保持します。そのような状況では、失われたサンプルレコードのハードウェア・イベント・カウントは、特殊なノード [Events Lost on Trace Overflow (トレース・オーバーフローで失われたイベント)] に関連付けられます。

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

関連記事

  • 解析結果の表示 この記事は、インテル® デベロッパー・ゾーンに公開されている、インテル® VTune™ Amplifier のオンラインヘルプの一部「Viewing Analysis Results」の日本語参考訳です。Windows* 用のヘルプではありますが、その他の OS […]
  • FreeBSD* サポートFreeBSD* サポート この記事は、インテル® デベロッパー・ゾーンに公開されている、インテル® VTune™ Amplifier のオンラインヘルプの一部「FreeBSD* Support」の日本語参考訳です。Windows* 用のヘルプではありますが、その他の OS […]
  • 非効率な同期非効率な同期 この記事は、インテル® デベロッパー・ゾーンに公開されている、インテル® VTune™ Amplifier のオンラインヘルプの一部「Inefficient Synchronization」の日本語参考訳です。Windows* 用のヘルプではありますが、その他の OS […]
  • ターゲットのビルド この記事は、インテル® デベロッパー・ゾーンに公開されている、インテル® VTune™ Amplifier のオンラインヘルプの一部「Building a Target」の日本語参考訳です。Windows* 用のヘルプではありますが、その他の OS […]
  • OpenMP* アプリケーションの解析OpenMP* アプリケーションの解析 この記事は、インテル® デベロッパー・ゾーンに公開されている、インテル® VTune™ Amplifier のオンラインヘルプの一部「Analyzing OpenMP* Applications」の日本語参考訳です。Windows* 用のヘルプではありますが、その他の OS […]