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

メモリー使用量ビューポイント

インテル® VTune™ Amplifier を使用して、キャッシュミス (L1/L2/LLC)、メモリーロード/ストア、メモリー帯域幅、およびシステムメモリーの割り当て/解放を解析して、高帯域幅の問題とメモリー依存のアプリケーションにおける NUMA 問題を特定します。

次の解析タイプを実行してメモリー使用量を解析できます。

解析が完了すると、インテル® VTune™ Amplifier はメモリー使用量ビューポイントを開き、このビューポイントでは、メモリーアクセスに関連するイベントベースのメトリックが表示されます。それぞれのメトリックは、インテル® アーキテクチャーで定義されているイベント比率と、事前定義された固有のしきい値を持っています。インテル® VTune™ Amplifier は、それぞれのプログラムユニット (関数など) で収集された比率を解析します。この値がしきい値を超え、プログラムユニットの CPU 時間が収集された CPU 時間全体の 5% を上回ると、潜在的なパフォーマンスの問題につながるため、その値はピンク色で強調表示されます。

帯域幅解析で示されるパフォーマンス・データを解釈するには、次のステップに従います。

  1. メモリー・オブジェクトによるパフォーマンス・メトリックを表示します。

  2. 帯域幅に関連するコード領域とメモリー・オブジェクトを特定します。

  3. 時間経過における帯域幅の問題を解析します。

  4. NUMA に関連するコードとメモリー・オブジェクトの問題を特定します。

  5. ソースを解析します。

メモリー・オブジェクトによるパフォーマンス・メトリックを表示 (Linux* ターゲットのみ)

メモリーアクセス解析の設定で [Analyze dynamic memory objects (動的メモリー・オブジェクトを解析)] オプションを有効にしていると、メモリー・オブジェクト (変数、データ構造体、配列) ごとのパフォーマンス・メトリックを表示するようにメモリー使用量ビューポイントを構成できます。

メモリー・オブジェクトの特定は、Linux* ターゲットのインテル® マイクロアーキテクチャー開発コード名 Sandy Bridge ベース以降のプロセッサーでのみサポートされます。Windows* では、キャッシュラインでグループ化して、コードに対するメトリックを見ることでアクセスするデータ構造を理解できます。

メモリー・オブジェクトにはいくつかのタイプがあります。

メモリー・オブジェクト・データには、[Bottom-up (ボトムアップ)] タブをクリックして [Memory Object (メモリー・オブジェクト)] または [Memory Object Allocation Source (メモリー・オブジェクトの割り当てソース)] を含むグループレベルを選択します。[Memory Object Allocation Source] は割り当てが行われた場所でグループ化し、[Memory Object] は個々の割り当て (呼び出し場所とサイズ) でグループ化します。

DLA を利用するハードウェア・イベントをベースとするメトリックだけが、メモリー・オブジェクト解析に適用できます。例えば、DLA を利用しないクロックティック・イベントをベースとする CPU 時間メトリックは、メモリー・オブジェクトに適用できません。適用できるメトリックには、ロード、ストア、LLC ミスカウント、および平均レイテンシーがあります。

帯域幅に関連するコード領域とメモリー・オブジェクトを特定

[Summary (サマリー)] ウィンドウでは、帯域幅依存の領域 (DRAM やインターコネクト) を選択して、ヒストグラムに表示される時間経過での帯域幅使用率を解析し、[Bandwidth Utilization (帯域幅使用率)] セクションを調査します。

このヒストグラムは、システムの帯域幅が特定の値 (帯域幅ごと) でどれくらい使用されたかを示し、High (高)、Medium (中)、Low (低) として帯域幅使用率を区分するしきい値を表示します。デフォルトでは、メモリー解析結果のしきい値は、インテル® VTune™ Amplifier が収集前に測定した最大 DRAM 帯域幅を基に計算され、[Summary] ウィンドウの [System Bandwidth (システム帯域幅)] セクションに表示されます。カスタム解析の結果でこの機能を有効にするには、[Evaluate max DRAM bandwidth (最大 DRAM 帯域幅を評価)] オプションを有効にします。このオプションが無効であると、しきい値はこの結果で収集された最大帯域幅の値を基に計算されます。また、下にあるスライドバーを移動してしきい値を設定できます。変更後の値はこのプロジェクト内のすべての結果に適用されます。

ヒストグラムの下にあるテーブルを調査して、選択された領域で帯域幅使用率が高いときに頻繁にアクセスされた関数を特定します。リストで関数をクリックすると、グリッドが [Bandwidth Domain/Bandwidth Utilization Type/Function/Call Stack (帯域幅ドメイン/帯域幅使用率タイプ/関数/コールスタック)] でグループ化された [Bottom-up] ウィンドウが開きます。[DRAM, GB/sec (DRAM、GB/秒)] > [High (高)] 使用率タイプの下に、システムの DRAM 帯域幅の使用率が高いすべての関数が表示されます。[LLC Miss Count (LLC ミスカウント)] でグリッドをソートすると、どの関数が最も高い DRAM 帯域幅に関連しているか分かります。

帯域幅により制限されるコードの特定に加え、インテル® VTune™ Amplifier は高帯域幅に影響するアクセス頻度の高いメモリー・オブジェクト (変数、データ構造体、配列) が分かるワークフローを提供します。ターゲットのメモリー・オブジェクト解析を有効にすると、[Bandwidth Utilization] セクションには選択された領域で帯域幅使用率が高いときに頻繁にアクセスされた上位のメモリー・オブジェクトのリストが示されます。リストからオブジェクトをクリックすると、グリッドが [Bandwidth Domain/Bandwidth Utilization Type/Memory Object/Allocation Stack (帯域幅ドメイン/帯域幅使用率タイプ/メモリー・オブジェクト/割り当てスタック)] でグループ化され、そのオブジェクトがハイライトされた [Bottom-up] ウィンドウに切り替わります。[DRAM] > [High] 使用率タイプの下に、システムの DRAM 帯域幅の使用率が高いすべてのメモリー・オブジェクトが表示されます。[LLC Miss Count] でグリッドをソートすると、どのメモリー・オブジェクトが最も高い DRAM 帯域幅に関連しているか分かります。

時間経過における帯域幅の問題を解析

時間経過でアプリケーションの帯域幅の問題を特定するため、[Bottom-up] ウィンドウの上部にある [Timeline (タイムライン)] ペインに注目します。メモリー解析結果の DRAM 帯域幅のグラフはインテル® VTune™ Amplifier が収集前に測定した最大 DRAM 帯域幅にスケールされます。カスタム解析の結果でこの機能を有効にするには、[Evaluate max DRAM bandwidth] オプションを有効にします。このオプションが無効であると、しきい値はこの結果で収集された最大帯域幅の値を基に計算されます。

帯域幅イベントはコアに関連付けられず、アンコア (iMC、統合メモリー・コントローラー) に関連付けられています。アンコアイベントは、パッケージ内のすべての CPU 間 (例えば、単一パッケージの 10 個の CPU コア) で共有される構造で発生します。これは、アンコアイベントを特定のコアに関連付けることは不可能であることを示唆します。そのため、インテル® VTune™ Amplifier は、アンコアイベントが発生したソケットまたはパッケージの時間のみを、帯域幅アンコア・イベント・カウントと関連付けます。

チップ上のメモリー・コントローラーを介してどれくらい DRAM が読み書きされたかを知るには、高帯域幅の値のバーにマウスをホバーします。特定の時間範囲の帯域幅に注目してフィルター処理を行うには、時間フィルター・コンテキスト・メニューを使用します。そして、特定のコードがすべての帯域幅を要求しているか判断するため、グリッドで帯域幅に関連するコアベースのイベントに切り替えます。

NUMA に関連するコードとメモリー・オブジェクトの問題を特定

現代のマルチソケット・システムの多くは、リモートメモリーよりもホーム (ローカル) CPU ソケットに割り当てられたメモリーのほうがレイテンシーと帯域幅に優れている、不均一メモリー・アーキテクチャー (NUMA) を採用しています。NUMA の問題を特定するため、[Bottom-up] 表示で階層的に組織化された次のメトリックに注目します。

アプリケーションのパフォーマンスは、インターコネクト・リンク (ソケット間接続) の帯域幅によっても制限されます。インテル® VTune™ Amplifier は、DRAM 帯域幅の問題を特定するのと同様の方法で、帯域幅の問題を引き起こすコードとメモリー・オブジェクトを特定するメカニズムを備えています。[Summary] ウィンドウで [Bandwidth Utilization Histogram (帯域幅使用率ヒストグラム)] を使用して、[Bandwidth Domain (帯域幅ドメイン)] ドロップダウン・メニューで [Interconnect (インターコネクト)] を選択します。

[Bandwidth Domain] ドロップダウン・メニューで、[Interconnect Incoming/Outgoing Non-Data (インターコネクトにおける非データカテゴリーの I/O)] を選択している場合、ヒストグラムでは、プロトコル・パケット・ヘッダー、スヌープ要求と応答などのハードウェアにより生成されたものとシステム・トラフィックで使用された帯域幅が表示されます。

インテル® VTune™ Amplifier は、インテル® マイクロアーキテクチャー開発コード名 Ivy Bridge EP 以降のインターコネクト帯域幅解析をサポートします。

[Bottom-up] タブに切り替えて、[Bandwidth Domain/Bandwidth Utilization Type/Function/Call Stack (帯域幅ドメイン/帯域幅使用率タイプ/関数/コールスタック)] グループレベルを選択します。システムのインターコネクト帯域幅の使用率が高い関数の実行を見るには、[Interconnect] ドメインのグリッドを展開して、[High] 使用率タイプの行を展開します。

また、[Timeline] 表示でインターコネクト帯域幅の使用率の高い領域を選択して、この領域をフィルター処理できます。

フィルター処理を適用した後、[Timeline] ペインの下のグリッド表示でその時間範囲で何が実行されたかを確認できます。

ソース解析

クリティカルな関数をダブルクリックすると、[Source (ソース)]/[Assembly (アセンブリー)] ウィンドウが開くのでソースコードを解析します。[Source]/[Assembly] ウィンドウには、選択された関数のコード行ごとのハードウェア・メトリックが表示されます。

メモリー・オブジェクトに関連する [Source]/[Assembly] データを表示するには次の操作を行います。

  1. [Bottom-up] ウィンドウで、[../Function/Memory Object/.. (../関数/メモリー・オブジェクト/..)] グループレベル (Function (関数)Memory Objects (メモリー・オブジェクト) よりも優先される) を選択します。

  2. 関数を展開し、この関数下のメモリー・オブジェクトをダブルクリックします。

    [Source]/[Assembly] ウィンドウが開いて、選択されたメモリー・オブジェクトへのアクセスが発生した関数のソース行ごとのメトリックが表示されます。

関連情報