インテル® VTune™ プロファイラー・ユーザーガイド

メモリー使用ビュー

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

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

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

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

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

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

  3. 帯域幅の問題を経時的に解析します。

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

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

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

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

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

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

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

DLA 対応のハードウェア・イベントベースのメトリックのみが、メモリー・オブジェクト解析に適用されます。例えば、CPU 時間メトリックは、DLA 非対応のクロックティックをベースとするため、メモリー・オブジェクトには適用できません。適用可能なメトリックは、ロード、ストア、LLC ミスカウント、および平均レイテンシーです。

帯域幅を高めるコード領域とメモリー・オブジェクトを特定

[サマリー] ウィンドウで、帯域幅ドメイン (DRAM やインターコネクト) を選択して帯域幅利用率を調査すると、分布図に表示される帯域幅利用率を時系列で解析できます。

この分布図は、システム帯域幅が特定の値 (帯域幅ドメイン) で使用された時間を表し、しきい値により帯域幅利用率を、高、中、低、に分類します。デフォルトでは、メモリー解析結果のしきい値は、収集を開始する前にインテル® VTune™ プロファイラーによって測定される達成可能な最大 DRAM 帯域幅に基づいて計算され、[サマリー] ウィンドウのシステム帯域幅に表示されます。カスタム解析結果でこの機能を有効にするには、[DRAM の最大帯域幅を評価] オプションを選択します。このオプションが無効にされていると、しきい値はこの結果で収集された最大帯域幅から計算されます。しきい値を変更するには、下部にあるスライドバーを使用します。変更された値は、プロジェクトの以降のすべての結果に適用されます。

分布図の下の表を調べて、選択したドメインの帯域幅利用率が高いときに頻繁にアクセスされた関数を特定します。リストの関数をクリックすると [ボトムアップ] ウィンドウが開き、[帯域幅ドメイン/帯域幅利用率タイプ/関数/コールスタック] で自動的にグループ化されたグリッドでその関数がハイライト表示されます。[DRAM、GB/秒] > [高] 利用率タイプの下に、システム DRAM 帯域幅利用率が高いときに実行されたすべての関数が表示されます。LLC ミスカウントでグリッドをソートすると、高い DRAM 帯域幅利用率に最も関連する関数が表示されます。

帯域幅が制限されたコードの特定に加えて、インテル® VTune™ プロファイラーは高い帯域幅利用率に影響する頻繁にアクセスされるメモリー・オブジェクト (変数、データ構造体、配列) を確認するワークフローを提供します。そのため、ターゲットのメモリー・オブジェクト解析を有効にすると、帯域幅利用率には選択したドメインで帯域幅利用率が高いときに頻繁にアクセスされた上位のメモリー・オブジェクトの表が示されます。リストのオブジェクトをクリックして [ボトムアップ] ウィンドウに切り替えると、[帯域幅ドメイン/帯域幅利用率タイプ/メモリー・オブジェクト/割り当てスタック ] で自動的にグループ化されたグリッドでそのオブジェクトがハイライト表示されます。[DRAM] > [高] 利用率タイプの下に、システム DRAM 帯域幅利用率が高いときにアクセスされたすべてのメモリー・オブジェクトが表示されます。LLC ミスカウントでグリッドをソートすると、高い DRAM 帯域幅利用率に最も関連するメモリー・オブジェクトが表示されます。

帯域幅の問題を経時的に解析

アプリケーションの帯域幅の問題を経時的に特定するには、[ボトムアップ] ウィンドウの上にある [タイムライン] ペインに注目します。メモリー解析結果の DRAM 帯域幅グラフは、収集開始前にインテル® VTune™ プロファイラーが測定した達成可能な最大 DRAM 帯域幅に応じてスケールされます。カスタム解析結果でこの機能を有効にするには、[DRAM の最大帯域幅を評価] オプションを選択します。このオプションが無効にされていると、しきい値はこの結果で収集された最大帯域幅から計算されます。

帯域幅イベントはコアではなく、アンコア (iMC、統合メモリー・コントローラー) に関連付けられます。アンコアイベントは、パッケージ内のすべての CPU 間で共有される構造 (例えば、単一パッケージ内の 10 個のコア) で発生します。そのため、1 つのアンコアイベントを特定のコード・コンテキストに関連付けることはできません。インテル® VTune™ プロファイラーは、帯域幅のアンコアイベントのカウントを、アンコアイベントが発生したソケット (パッケージ) と時間にのみ関連付けます。

高い帯域幅のバーにカーソルを移動すると、オンチップのメモリー・コントローラーを介して DRAM を読み書きしたデータ量がわかります。[時間フィルター] コンテキスト・メニューを使用して、帯域幅が目立つ特定の時間範囲でフィルター処理します。次に、下のグリッドで帯域幅と関連するコアベースのイベントに切り替えて、帯域幅に影響するコード領域を判断します。

NUMA の問題があるコードとメモリー・オブジェクトを特定

現代の多くのマルチソケット・システムは、ホーム (ローカル) CPU ソケットで割り当てられたメモリーへのアクセスが、リモートシステムのメモリーへのアクセスよりも優れたレイテンシー/帯域幅を持つ NUMA (Non-Uniform Memory Access - 不均一メモリーアクセス) に基づいています。NUMA の問題を特定するには、[ボトムアップ] ビューで階層的に組織された次のメトリックに注目します。

アプリケーションのパフォーマンスは、インターコネクト・リンク (ソケット間接続) の帯域幅によって制限される可能性があります。インテル® VTune™ プロファイラーは、DRAM 帯域幅の問題を特定する方法と同様に、このタイプの帯域幅の問題を引き起こすコードおよびメモリー・オブジェクトを識別するメカニズムを提供します。[サマリー] ウィンドウで、[帯域幅利用率分布図] を使用して [帯域幅ドメイン] ドロップダウン・メニューから [インターコネクト] を選択します。

[帯域幅ドメイン] ドロップダウン・メニューで、[非データカテゴリーのインターコネクト受信/送信] を選択した場合、分布図にはハードウェアによって利用される帯域幅、およびプロトコル・パケット・ヘッダー、スヌープ要求と応答などのシステム・トラフィックが示されます。

インターコネクト帯域幅解析は、インテル® マイクロアーキテクチャー開発コード名 Ivy Bridge EP 以降をサポートするインテル® VTune™ プロファイラーで使用できます。

[ボトムアップ] タブに切り替えて、[帯域幅ドメイン/帯域幅利用率タイプ/関数/コールスタック] グループ化レベルを選択します。[インターコネクト] ドメイングリッド行を展開し、利用率の行を展開して、システム・インターコネクトの帯域幅利用率が高いときに実行されるすべての関数を表示します。

[タイムライン] ビューでインターコネクト帯域幅利用率が高い領域を選択し、この領域をフィルターアウトすることもできます。

フィルターが適用されると、[タイムライン] ペインの下にある [グリッド] ビューに新しい範囲で実行されたデータが表示されます。

ソースを解析

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

メモリー・オブジェクトの [ソース/アセンブリー] データを表示するには、次の操作を行います。

  1. [ボトムアップ] ウィンドウで、[../関数/メモリー・オブジェクト /..] グループ化レベル (関数粒度はメモリー・オブジェクト粒度よりも優先される) を選択します。

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

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

関連情報