技術ポータル「iSUS」をリニューアルいたしました!お探しの記事を快適に検索いただくための絞り込み機能 (トピック検索) の使い方はこちら。

インテル® VTune™ プロファイラー: Windows 向けパフォーマンス解析のチュートリアル

インテル® VTune™ プロファイラー

この記事はインテルのウェブサイトで公開されている「Intel® VTune™ Profiler: Performance Analysis Tutorial for Windows OS」 (英語) を iSUS で翻訳した日本語参考訳です。原文は更新される可能性があります。原文と翻訳文の内容が異なる場合は原文を優先してください。

概要

このチュートリアルでは、Windows 向けインテル® VTune™ プロファイラーを使用して、アプリケーションのパフォーマンスを低下させる可能性のあるアルゴリズムまたはハードウェア利用率の問題を特定します。アプリケーションのプロファイル方法を学び、利用可能なハードウェア・リソースを最大限に活用します。

目的

インテル® VTune™ プロファイラーで提供される C++ サンプル・アプリケーション matrix を解析および最適化します。このサンプルは、大きな行列の乗算を行います。

所要時間

このチュートリアルの完了には、20 分ほどの時間を要します。

学習目的

このチュートリアルを通して、以下のことを学びます:

  • インテル® VTune™ プロファイラーで、アプリケーションのプロジェクトを開きます。
  • [パフォーマンス・スナップショット] 解析を実行して、パフォーマンスに関する問題の概要を取得します。matrix サンプル・アプリケーションの主な問題領域を特定し、最適化の次のステップを特定します。
  • [メモリーアクセス] 解析を実行して、メモリー・ボトルネックの詳細を理解し、解決します。
  • [HPC パフォーマンス特性] 解析を使用して、ベクトル化に関連する情報を含む CPU 使用率を把握します。

学習リソース

ワークフローを理解する

このワークフローに従って、インテル® VTune™ プロファイラーを使用して、シリアルまたは並列アプリケーションのパフォーマンスのボトルネックを特定および解析します。このチュートリアルでは、matrix と呼ばれるサンプル・アプリケーションを使用します。

要件

以下のインテル® ソフトウェア・ツールを Windows システムにダウンロードします:

両方のツールは、インテル® oneAPI ツールキットに含まれています。

さらに、Microsoft Visual Studio IDE をダウンロードすることもできます。

注:
このチュートリアルでは、インテル® oneAPI DPC++/C++ コンパイラーを使用して、解析の共通ベースラインを設定し、パフォーマンス向上を確認します。他のコンパイラーを選択すると、このワークフローの結果が変わる可能性があります。

ワークフロー

matrix サンプル・アプリケーションのパフォーマンスの問題を見つけて修正するには、

  1. アプリケーションのパフォーマンス・ベースラインを取得します。

    1. [パフォーマンス・スナップショット] を実行します。

    2. パフォーマンス・スナップショットの結果を解釈します。

  2. matrix アプリケーションのボトルネックを特定します。[メモリーアクセス] 解析を実行して結果を解釈します。

  3. メモリーアクセスのボトルネックがある場合はそれを解決します。アプリケーションを再コンパイルします。

  4. パフォーマンスの改善を評価します。[HPC パフォーマンス特性] 解析を実行して結果を解釈します。

  5. プラットフォームに適したベクトル化を有効にします。

  6. パフォーマンスの向上を確認します。最適化前後の結果を比較します

GUI とコマンドラインの使用

このチュートリアルでは、インテル® VTune™ プロファイラーのグラフィカル・ユーザー・インターフェイス (GUI) から解析を実行する方法を説明します。インテル® VTune™ プロファイラーのコマンドライン・インターフェイス (vtune コマンド) を使用することもできます。GUI から実行する解析タイプごとに、ウィンドウ下部の [コマンドライン] ボタン をクリックすると、対応するコマンドライン行が表示されます。ユーザーガイドの「コマンドライン・インターフェイス」セクションに、さらに詳しい情報があります。

パフォーマンス・スナップショットを実行

アプリケーションのパフォーマンス・ベースラインを確立します。パフォーマンス・スナップショット解析を実行して結果を解釈します。

パフォーマンス・スナップショット解析を実行して、アプリケーションの問題点全体を把握します。これにより、最も重要な問題の解決に集中し、最大限のパフォーマンス向上を実現できます。この解析タイプでは、ボトルネックの調査に有用な他の解析タイプも示されます。

matrix サンプル・プロジェクトを開く

パフォーマンス解析を開始するには、最初にアプリケーションのプロジェクトを作成します。プロジェクトは、解析対象の設定やデータ収集結果を保持するコンテナです。

インテル® VTune™ プロファイラーには、matrix サンプル・アプリケーションで動作するように事前構成されたサンプル・プロジェクトが含まれています。

matrix プロジェクトを開きます:

  1. インテル® VTune™ プロファイラー GUI を開きます:

    1. 適切な環境変数を設定してください。スクリプトを実行:

      <install-dir>\env\vars.bat

      インテル® VTune™ プロファイラーのデフォルトの <install-dir> は次のとおりです:

      [Program Files]\Intel\oneAPI\vtune\<version>

    2. アプリケーションを実行します。

      [スタート] メニューから [VTune Profiler 202x] のアイコンを探してください。アイコンを右クリックして、[VTune Profiler 202x] を管理者として実行します。

  2. インテル® VTune™ プロファイラーの [ようこそ] 画面が表示されると、[プロジェクト・ナビゲーター]sample (matrix) プロジェクトが開きます。プロジェクトが表示されない場合は、手動で開いてください:

    1. [メニュー] ボタンをクリックします。

    2. [開く] > [プロジェクト…] を選択します。

    3. ローカルマシン上の matrix プロジェクトを検索して、[開く] をクリックします。

      sample (matrix) プロジェクトのデフォルトの保存場所は以下です:

      [Users]\<user>\Documents\VTune\Projects\sample (matrix)

注:

  • このチュートリアルでは、事前構成された matrix サンプル・アプリケーションを使用します。自身のアプリケーションを解析する場合、リリースモードですべての最適化を適用した状態でビルドしてください。また、本格的な解析を始める前に、パフォーマンスのベースラインを設定してください。Windows ターゲットの準備の詳細については、ユーザーガイドの「Windows ターゲット」セクションを参照してください。

  • パフォーマンス・データの一貫性を維持するため、パフォーマンス解析中はシステム上で実行される他のアプリケーションを最小限にしてください。

パフォーマンス・スナップショットを実行

  1. 新しい解析を開始するには、[解析を設定 …] ボタンをクリックします。デフォルトでは、プロジェクトはローカルシステムで matrix アプリケーションの [パフォーマンス・スナップショット] 解析を実行するように構成されています。

  2. [開始] ボタンをクリックして解析を実行します。

データ収集が完了したら、インテル® VTune™ プロファイラーは収集された結果をファイナライズし、パフォーマンス・スナップショット解析の [サマリー] ビューポイントを開きます。

パフォーマンス・スナップショットの結果を解釈

matrix アプリケーションの主な問題点を特定します。

パフォーマンス・スナップショット解析が完了すると、[サマリー] ウィンドウに結果が表示されます。

サマリーの内容を理解する

[サマリー] ウィンドウで以下を確認します:

  • 解析ツリーにおいて、パフォーマンスの問題を調査する際に検討すべき解析タイプを見つけてください。それらの解析タイプは赤く強調表示されます。
  • 問題の深刻度を評価するには、右側のペインで強調表示されているメトリックを参照してください。メトリックを展開表示すると、それに関連する下位レベルのメトリックが表示されます。
  • パフォーマンス・スナップショットを実行したシステムについて確認するには、[収集とプラットフォーム情報] を展開してください。この情報は、異なるハードウェア・プラットフォーム間で結果を比較する際に役立ちます。

問題領域を特定する

matrix のサンプルでは、パフォーマンスのボトルネックに関連する以下のメトリックに注目してください:

  • アプリケーションの [経過時間] が高い。

  • [IPC (サイクルあたりの命令数)] メトリック値は、通常 1 サイクルあたり約 4 命令を実行できる最新のスーパースカラー・プロセッサーとしては非常に低いことを示しています。低い IPC 値は、プロセッサーが実行時間のほとんどでストールしていることを示します。

  • IPC の値が低い理由をさらに理解するには、[マイクロアーキテクチャー使用率] セクションを展開してください。命令はメモリーアクセスによって制限されることが分かります。これは、アプリケーションがメモリー依存であることを裏付けるものです。

  • [ベクトル化] のセクションでは、サンプル・アプリケーションに浮動小数点演算が含まれているにもかかわらず、スカラー命令が実行されていることを示しています。

この時点で、解析タイプに関して次のような潜在的なパフォーマンス上の問題が観察されます。これらの問題は、それぞれを調査するのに役立ちます。さらに、パフォーマンス・スナップショットでは、別の解析タイプであるホットスポット解析も推奨しています。

パフォーマンス問題 さらに調査するための解析タイプ
  ホットスポット解析
ベクトル化されていない HPC パフォーマンス特性解析
メモリーアクセス メモリーアクセス解析

ホットスポット解析では、時間経過で最も大きく影響したコード領域であるホットスポットを特定します。大規模なアプリケーションでは、この解析タイプはアルゴリズムの流れを理解し、コードのさまざまなセクションから頻繁に呼び出される関数を特定するのに役立ちます。この matrix サンプルは小さく、関数が 1 つしかないため、ホットスポットはその関数内にある可能性が高くなります。これを詳しく確認するには、ホットスポット解析を実行するよりも、パフォーマンス問題の根源を調査する方が有益かもしれません。

ベクトル化によって、より多くの演算を並列に実行する能力が向上します。しかし、IPC 値が低いため、すべての命令の実行速度が遅くなります。したがって、IPC レートを向上させる前にベクトル化を改善しても、必ずしもアプリケーションのパフォーマンスが向上するとは限りません。

そのため、まずは IPC メトリックの改善を優先すべきです。それには、メモリーアクセス解析を行い、アプリケーションがメモリー依存である原因をさらに理解してください。

メモリーアクセス解析

メモリーアクセス解析を行い、アプリケーションがメモリー依存である原因を理解します。

メモリーアクセス解析を実行する

  1. パフォーマンス・スナップショットの結果で、[メモリーアクセス] アイコンをクリックします。インテル® VTune™ プロファイラーの [ようこそ] 画面で [解析を設定 …] をクリックして、[どのように] ペインで [メモリーアクセス] を選択することもできます。

  2. [どのように] ペインで、[OpenMP 領域を解析] オプションを無効にします。matrix アプリケーションでは、このオプションは必要ありません。

  3. [開始] ボタンをクリックして解析を実行します。

メモリー・アクセス・データを解釈

解析が完了し、インテル® VTune™ プロファイラーが結果をファイナライズすると、[メモリー使用] ビューポイントに [サマリー] ペインが開きます。

ここでも、アプリケーションはメモリー依存であることに注意してください。システムは DRAM 帯域幅のみによって制約されるわけではありません。この詳細から、アプリケーションは物理的な DRAM 帯域幅の飽和ではなく、頻度の高い小さなメモリー要求によって制限されていることが分かります。

multiply1 関数の正確なメトリックを表示するには、[ボトムアップ] タブに切り替えます。

multiply1 関数では、[CPU 時間][メモリー依存] メトリック値が最も高く、グリッドの最上部にあります。

[LLC ミスカウント] のメトリックが非常に高いことに注意してください。これは、アプリケーションがキャッシュを有効に活用しないメモリー・アクセス・パターンを持っていることを示しています。これにより、プロセッサーが LLC を頻繁にミスし、DRAM からデータを要求するレイテンシーのコストがかかります。

[ボトムアップ] グリッドの [Loop at line 49 in multiply1] をダブルクリックして、[ソース] ウィンドウを開きます。

ソースウィンドウでは、最も時間のかかる行は、multiply1 関数内で行列乗算を実行するループであることが分かります。

サンプルコードのコメントで説明されているように、行列 ‘b‘ の反復処理は大きなストライドで行われます。この大きなストライドは、キャッシュ利用効率の低下を引き起こす可能性があります。

この問題を解決する一つの方法は、ループ交換を行うことです。この例では、この手法により、メインループ内での行列の行と列へのアクセス方法が変更されます。これにより、非効率なメモリー・アクセス・パターンが排除され、プロセッサーは LLC をより有効に活用できるようになります。

メモリーアクセスの問題を解決

前の手順で特定されたメモリーアクセスの問題を解決するため、ソースコードを編集します。その後、matrix アプリケーションを再コンパイルします。これらの手順は詳しく説明されていますが、先に進む前に、コンパイラーの最適化設定をメモしておいてください。

コンパイラーの最適化

このチュートリアルでは、インテル® oneAPI DPC++/C++ コンパイラーを使用します。他のコンパイラーを選択すると、このワークフローの結果が変わる可能性があります。

このセクションの手順では、コンパイラーの最適化レベルを -O1 最適化 (コードサイズ優先) に設定する必要があります。

-O1 最適化を適用したソフトウェアのパフォーマンスをプロファイルすることは、望ましいように思えるかもしれません。ただし、matrix サンプルのデフォルト設定では、最適化オプションが /Od (または無効) に設定されています。この設定は、インテル® VTune™ プロファイラーを使用して、コンパイラー・オプションの分かりにくい動作に関連する問題を検出する方法を示す例として使用されます。

このような問題は、実際のアプリケーションでも発生する可能性があります。これらの問題の原因は、単純な入力ミスから、コンパイラー・オプションの理解不足がパフォーマンスに影響するような複雑な状況まで多岐にわたります。

サンプルコードを編集して再コンパイル

インテル® oneAPI DPC++/C++ コンパイラーを使用して Microsoft Visual Studio でコードを編集および再コンパイルするには、次の手順に従います:

  1. マシン上の matrix サンプル・アプリケーションのフォルダーを見つけます。デフォルトの場所は以下です:

    [ドキュメント]\VTune\samples\matrix

  2. ..\matrix\vc16 フォルダーで、matrix.sln という Visual Studio ソリューションを開きます。

  3. [Release] 構成と [x64] プラットフォームを有効にしてアプリケーションをビルドしていることを確認してください。

  4. [ソリューション エクスプローラー] ペインで、matrix プロジェクトを右クリックし、[プロパティ] を選択します。

  5. 以下のオプションを設定します:

    メニュー オプション 設定
    [構成プロパティ] > [General] [Platform Toolset] Intel C++ Compiler <version>
    [構成プロパティ] > [vcpkg] [Use Vcpkg] No
    [C/C++] > [General] [Debug Information Format] [Program Database (/Zi)]
    [C/C++] > [Optimization] [Optimization] Maximum Optimizations (Favor Size) (/O1)
    [C/C++] > [Diagnostics [Intel C++]] [Optimization Diagnostic Level] Level 2 (/Qopt-report:2)
  6. multiply.h ヘッダーファイルの 36 行目を変更します:

    #define MULTIPLY multiply1

    を以下に変更します:

    #define MULTIPLY multiply2

    この変更により、プログラムは multiply.c ソースファイルの multiply2 関数を使用するようになります。multiply2 関数を使用すると、メモリーへのアクセス問題を解決するループ交換が実装されます。/O1 を使用すると、自動ベクトル化も有効になります。

  7. プロジェクトをビルドします。

パフォーマンスの改善を評価

メモリーアクセスの問題を解決した後、HPC パフォーマンス特性解析を実行してください。これは、パフォーマンス・スナップショットの結果におけるもう一つの推奨事項です。

HPC パフォーマンス特性解析を実行

  1. インテル® VTune™ プロファイラーの [ようこそ] 画面で [解析を設定 …] をクリックします。
  2. [どのように] ペインで、ヘッダーをクリックして解析ツリーを開きます。
  3. [並列処理] グループで、[HPC パフォーマンス特性] を選択します。
  4. [開始] をクリックして解析を実行します。

コンパイラーと IDE によっては、解析を構成するときに、前の手順で再コンパイル中に生成された別の実行可能ファイルを参照する場合があります。例えば、デフォルトでは、Visual Studio は実行可能ファイルを [matrix]\vc16\x64\Release に配置します。

結果の解釈

HPC パフォーマンス特性解析が完了すると、プロファイル結果は [サマリー] ウィンドウに表示されます。

[サマリー] ウィンドウでは、以下のことが確認できます:

  • 経過時間が大幅に短縮されました。この改善は、メモリーアクセスのボトルネックを解消したことによるものです。このメモリーアクセスにより、プロセッサーはキャッシュを頻繁にミスし、DRAM からデータを要求するレイテンシーのコストがかかります。

  • [ベクトル化] メトリックは 100% であり、コードがベクトル化されていることを示しています。しかし、ベクトル化が最適ではなかったため、このメトリックは依然としてボトルネックとして赤色で表示されています。この解析は、AVX2 命令セットに対応したインテル® プロセッサーを搭載したマシン上で実行されました。[ベクトル化] メトリックによると、命令の 100% が 128 ビット・レジスターを使用して実行されています。これは、256 ビット幅のレジスターが使用されなかったことを意味します。したがって、インテル® VTune™ プロファイラーは、128 ビット・ベクトル・レジスターの使用率 100% を問題としてフラグ付けしています。

[ベクトル化] のセクションでは、[CPU 時間による FPU を使用する上位のループ/関数] のサブセクションに注目してください。

multiply2 関数のメインループは古い SSE2 命令セットを使用してベクトル化され、コンパイルと解析は AVX2 をサポートするプロセッサーで実行されたことに注意してください。そのため、ハードウェア・リソースの一部は十分に活用されていないままです。

プラットフォームに適したベクトル化を有効にするには、次の手順に従います。

プラットフォームに適したベクトル化を有効にする

利用するプラットフォームに合わせて、使用するベクトルレジスターを有効にしてください。次に、ベクトル化の効率が改善されたか確認します。

/QxHost オプションを使用すると、プロセッサーがサポートする最適な命令セット拡張を使用して matrix アプリケーションをコンパイルできます。ソフトウェアをさまざまなマイクロアーキテクチャーで実行できるように複数のコードパスを生成するには、インテル® oneAPI DPC++/C++ コンパイラーの axQax (英語) オプションを参照してください。

完全なベクトル化を有効にします

利用するプラットフォームに適したベクトル命令セットを使用するには、コンパイラーに対して、プロセッサーで利用可能な最適なベクトル拡張と同じものを使用するように指定してください。

Visual Studio でプラットフォームに適したベクトル化を有効にするには、次の手順に従います:

  1. [ソリューション エクスプローラー] ペインで、matrix プロジェクトを右クリックし、[プロパティ] を選択します。

  2. [C/C++] > [Code Generation [Intel C++]] メニューを開きます。

  3. [Intel Processor-Specific Optimization] オプションを、[Same as the host processor performing the compilation (/QxHost)] に設定します。この設定は、コンパイルを実行するプロセッサーがサポートする最適な命令セット拡張を使用するようにコンパイラーに指示します。

  4. 変更を保存します。

  5. アプリケーションをビルドします。

HPC パフォーマンス特性解析によるベクトル化の検証

HPC パフォーマンス特性解析を実行して、matrix アプリケーションが適切にベクトル化されていることを確認します。

解析が完了したら、[サマリー] ウィンドウで結果を確認します。

以下の点にご注目ください:

  • アプリケーションの [経過時間] がわずかに減少しました。

  • [ベクトル化] メトリックは 100% であり、コードは完全にベクトル化されました。

  • [パックド DP FLOP] 命令の合計 100.0% が 256 ビット・レジスターを使用して実行されました。使用されるベクトル命令セットは主に AVX であり、一部に積和演算命令 (FMA) が使用されています。

  • アプリケーション全体の速度は向上したものの、ベクトル化の変更により、CPI レートメモリー依存などの一部のパフォーマンス・メトリックが悪化しました。これは、ループ最適化には、メモリー・アクセス・パターンに影響するアンロールなどが含まれる可能性があるためです。この matrix サンプルには、この状況を改善するキャッシュ・ブロッキングなど高度な最適化が含まれています。

  • matrix アプリケーションは非常に高速です。この速度のため、パフォーマンスは他のタスクによる干渉やシステム上のオーバーヘッドの影響を受けやすくなります。些細な最適化では、期待通りのパフォーマンス向上が必ずしも得られるとは限りません。ここでは、行列のサイズを大きくすると効果的です。

パフォーマンスの最適化は繰り返し作業です。この matrix のサンプルには、パフォーマンス向上に検討できるその他の手法が用意されています。

パフォーマンスの向上を確認

チュートリアルの過程では、matrix サンプル・アプリケーションのパフォーマンスを向上させるために複数の変更を適用しました。最適化を行う前に記録しておいたベースラインのパフォーマンスと、新しいパフォーマンスを比較してみましょう。

最適化前後のパフォーマンスを比較

インテル® VTune™ プロファイラーで、複数の解析タイプの結果を比較し、パフォーマンスの変化を確認します。異なる解析タイプ (ホットスポットやパフォーマンス・スナップショットなど) の結果を比較する場合、比較対象は両方の解析タイプに共通するメトリックに限定されます。

  1. インテル® VTune™ プロファイラーの UI で、左側のツールバーから [結果の比較] を選択します。

  2. 比較する結果を選択します:

    • [結果 1] は、元のパフォーマンス・スナップショットの結果です。
    • [結果 2] は、最新の HPC パフォーマンス特性の結果です。

  3. [比較] をクリックします。

インテル® VTune™ プロファイラーは、2 つの解析タイプに共通するメトリック間の差分を計算します。比較結果が [サマリー] ウィンドウに表示されます。

任意のメトリックペインを展開して、両方の結果に共通するすべてのメトリックの差分を確認できます。

例えば、matrix サンプル・アプリケーションの経過時間メトリックは、6,288 秒短縮されました。

これでチュートリアルは完了です。

訳者注:

  1. この記事のサンプルを実行したシステムには、インテル® Core™ i7 13700K が搭載されています。

  2. この記事で使用したコンパイラーは、oneAPI ツールキット 2026 に含まれるバージョンです。

  3. インテル® VTue™ プロファイラー 2026.1 に日本語パッケージを適用したバージョンを使用しています。

  4. オリジナルの英語版と結果が若干異なります。

法務上の注意書き

インテルのテクノロジーを使用するには、対応したハードウェア、ソフトウェア、またはサービスの有効化が必要となる場合があります。

絶対的なセキュリティーを提供できる製品またはコンポーネントはありません。

実際の費用と結果は異なる場合があります。

© Intel Corporation. Intel、インテル、Intel ロゴ、その他のインテルの名称やロゴは、Intel Corporation またはその子会社の商標です。
* その他の社名、製品名などは、一般に各社の表示、商標または登録商標です。

本資料は、(明示されているか否かにかかわらず、また禁反言によるとよらずにかかわらず) いかなる知的財産権のライセンスも許諾するものではありません。

本資料で説明されている製品には、エラッタと呼ばれる設計上の不具合が含まれている可能性があり、公表されている仕様とは異なる動作をする場合があります。現在確認済みのエラッタについては、インテルまでお問い合わせください。

インテルは、明示されているか否かにかかわらず、いかなる保証もいたしません。ここにいう保証には、商品適格性、特定目的への適合性、および非侵害性の黙示の保証、ならびに履行の過程、取引の過程、または取引での使用から生じるあらゆる保証を含みますが、これらに限定されるわけではありません。

性能は、使用状況、構成、その他の要因によって異なります。詳細については、http://www.intel.com/PerformanceIndex/ (英語) を参照してください。

タイトルとURLをコピーしました