インテル® VTune™ プロファイラー・ユーザーガイド
計算集約型またはスループット・アプリケーションの CPU 利用率、メモリー効率、および浮動小数点利用率を予測するには、HPC パフォーマンス特性を使用します。計算集約型やスループット・アプリケーションでは、経過時間中にハードウェア・リソースを効率良く使用する必要があります。アプリケーションのパフォーマンスとランタイムを最適化する出発点として、HPC パフォーマンス特性解析を使用します。
HPC パフォーマンス特性ビューポイントで示されるパフォーマンス・データを解釈するには、次のステップに従います。
ハイブリッド・アプリケーションをチューニングする基本ステップを検討するには、OpenMP* と MPI アプリケーション解析のチュートリアルを利用してください。インテル® デベロッパー・ゾーン (https://software.intel.com/en-us/itac-vtune-mpi-openmp-tutorial-lin (英語)) でチュートリアルを入手できます。HPC パフォーマンス特性解析を説明するウェビナーは、https://software.intel.com/en-us/videos/hpc-applications-need-high-performance-analysis (英語) でご覧いただけます。
アプリケーションの実行に関する一般的な情報を提供する [サマリー] ウィンドウから調査を始めます。最適化の重要な範囲には、経過時間と 1 秒あたりの浮動小数点演算数 (単精度、倍精度、およびレガシー x87) が含まれます。赤文字で示される部分が最適化の対象となる可能性があります。コードの改善に関する詳細を確認するには、フラグにカーソルを移動します。
最適化前後のバージョンを比較するベースラインとして、経過時間と GFLOPS 値を使用します。
[サマリー] ウィンドウを確認して、アプリケーションの最適化の可能性を見つけます。改善の可能性があるパフォーマンス・メトリックは赤く表示されます。検出される問題には、有効な物理コア利用率、メモリー依存、ベクトル化、およびこれらの組み合わせが含まれます。以降のセクションでは、それぞれの問題で推奨される次のステップを説明します。
CPU 利用率
アプリケーションの並列化効率の基準として、有効な物理コア利用率メトリックを調査します。100% の値は、アプリケーション・コードの実行で利用可能なすべての物理コアが利用されていることを意味します。値が 100% 未満である場合、非効率な並列処理の原因を特定するため、2 番目のメトリックを検討する必要があります。
論値コア活用の可能性を理解します。状況によっては、論理コアを利用するとアプリケーションの並行性が向上し、全体のパフォーマンスを改善できます。
インテル® Xeon Phi™ プロセッサーや Intel Atom® プロセッサーなど、一部のインテル® プロセッサーや、インテル® ハイパースレッディング・テクノロジー (インテル® HT テクノロジー) が無効であるかサポートされないシステムでは、物理コアと論理コアの利用率メトリックの内訳は表示されません。そのような場合、単一の有効な CPU 利用率メトリックが表示され、並列実行の効率が示されます。
OpenMP* や MPI ランタイム・ライブラリー使用しないアプリケーションの場合:
アプリケーションの経過時間を CPU 利用率レベルまで細分化した 有効な CPU 利用率分布図が表示されます。
[ボトムアップ] と [トップダウン・ツリー] ウィンドウを使用して、アプリケーションで CPU 利用率別に最も時間のかかる関数を特定します。最適化 (並列化など) の候補として、最大の CPU 時間と低い CPU 利用率の関数に注目します。
インテルの OpenMP* を使用するアプリケーション:
シリアル時間と並列領域の実行時間を比較します。シリアル領域が長い場合、さらに並列処理を導入するか、並列化が困難なシリアル領域ではアルゴリズムやマイクロアーキテクチャーのチューニングを行って、シリアル実行を短縮するオプションを検討してください。スレッドカウントの多いマシンでは、シリアル領域は潜在的なスケーリングへの悪影響が大きいため (アムダールの法則)、可能な限り最小にすべきです。さらに並列化の候補を見つけるためシリアル・ホットスポットを調査します。
OpenMP* 潜在的なゲインを調査して、コードの並列領域での OpenMP* の並列化効率を予測します。潜在的なゲインメトリックは、実測された経過時間と並列領域の理想化された経過時間の差を予測します。理想化された経過時間とは、スレッドのバランスが完璧で OpenMP* ランタイムのオーバーヘッドがゼロであると仮定した場合の経過時間です。このデータを使用して、OpenMP* 並列処理を改善することで短縮できる最大時間を見積ることができます。領域の潜在的なゲインが顕著である場合、さらに詳しく解析するため、領域名のリンクを選択して [ボトムアップ] ウィンドウに移動できます。[OpenMP* 領域] グループは、バリアによるインバランスなどの非効率なメトリックの詳しい解析を示します。
並列領域内で複数のロックが使用されている場合、特定のロックのパフォーマンスへの影響を特定するにはスレッド化解析を行うことを検討してください。
MPI アプリケーション:
MPI インバランス・メトリックは、プロファイルしたノードのランク数で正規化された、ランクが通信操作の待機でスピンに費やした CPU 時間を示します。メトリックの問題検出の説明は、ランクごとの最小 MPI ビジー待機時間を基にしています。ランクごとの最小 MPI ビジー待機時間が顕著ではない場合、最小時間のランクはアプリケーションが実行されるクリティカル・パスにある可能性が大きいです。この場合、このランクの CPU 利用率メトリックを調査します。
MPI + OpenMP* ハイブリッド・アプリケーション:
サブセクションのクリティカル・パス上の MPI ランクには、シリアル時間 (OpenMP* 領域外)、並列領域時間、および OpenMP* 潜在的なゲインなどの OpenMP* 効率メトリックが表示されます。最小 MPI ビジー待機時間が顕著である場合、ランク間の最適ではない通信スキーマ、または他のノードで引き起こされたインバランスが原因である可能性があります。この場合、通信スキーマの詳細な解析にインテル® Trace Analyzer & Collector を使用します。
メモリー依存
高いメモリー依存値は、データのフェッチにより実行時間の大部分が費やされていることを示します。ここでは、異なるキャッシュ階層レベル (L1、L2、L3) で処理される、または DRAM からのデータフェッチのストールによって失われたサイクルの一部を示します。DRAM アクセスに直結する最終レベルのキャッシュミスでは、レイテンシー依存のストールと比較する際に特定の最適化手法が必要になるため、ストールがメモリー帯域幅の制限によるものであるか区別することが重要です。インテル® VTune™ プロファイラーは、DRAM 依存メトリックの問題の説明でこの問題を特定するヒントを示します。このセクションではまた、メモリーストールが NUMA の問題に関連しているか確認するため、ローカルソケットとリモートソケットへのアクセスを比較したパーセンテージを示します。
インテル® Xeon Phi™ プロセッサー開発コード名 Knights Landing では、メモリーアクセスの効率を評価する基準となるメモリーストールを測定する方法がありません。そのため、高レベルの特性メトリックとしてメモリー関連のストールを含むバックエンド・ストールが示されます。第 2 レベルのメトリックは、特にメモリーアクセス効率に注目します。
高い L2 ヒット依存 や L2 ミス依存値は、L2 ヒットやミスの処理に高い割合のサイクルが費やされたことを示します。
L2 ミス依存メトリックは、ハードウェア・プリフェッチャーが L2 キャッシュに取り込んだデータを考慮しません。ただし、ハードウェア・プリフェッチャーによる大量の DRAM/MCDRAM トラフィックが発生すると、帯域幅が飽和する場合があります。要求ミスと HW プリフェッチャー・メトリックは、要求ロードやハードウェア・プリフェッチャーによるすべての L2 キャッシュ入力要求のパーセンテージを示します。
高い DRAM 帯域幅依存や MCDRAM 帯域幅依存値は、経過時間の大部分が高い帯域幅利用率に費やされていることを示します。高い DRAM 帯域幅依存値がある場合は、可能であれば、メモリーアクセス解析を実行して、高帯域幅メモリー (MCDRAM) に割り当て可能なデータ構造を識別します。
帯域幅利用率分布図は、システム帯域幅が特定の値 (帯域幅ドメイン) で使用された時間を表し、しきい値により帯域幅利用率を、高、中、低、に分類します。しきい値は、最大値を求めるベンチマークに基づいて計算されます。しきい値を変更するには、分布図の下にあるスライドバーを使用します。変更された値は、プロジェクトの以降のすべての結果に適用されます。
[ボトムアップ] ウィンドウに切り替えて、グリッド内の [メモリー依存] カラムを確認し最適化の可能性を判断します。
アプリケーションがメモリー依存である場合、さらに深いメトリックとそのメトリックをメモリー・オブジェクトに関連する機能について、メモリーアクセス解析を行うことを検討してください。
ベクトル化
ベクトル化と GFLOPS メトリックは、インテル® マイクロアーキテクチャー開発コード名 Ivy Bridge、Broadwell、および Skylake でサポートされています。インテル® Xeon Phi™ プロセッサー (開発コード名 Knights Landing) では機能が制限されます。メトリックは、第 4 世代のインテル® プロセッサーでは利用できません。システムで利用可能なプロセッサー・ファミリーを表示するには、[解析の設定] ウィンドウの [どのように] ペインの [詳細] セクションを展開します。
ベクトル化メトリックは、パックド浮動小数点演算のパーセンテージを表します。0% はコードが完全にスカラーであることを意味し、100% は完全にベクトル化されていることを意味します。メトリックはベクトル命令の実際のベクトル長は考慮しません。その結果、コードが完全にベクトル化され、ベクトル長の半分だけをロードするレガシー命令セットを使用すると、ベクトル化メトリックは 100% を示します。
低いベクトル化メトリックは、浮動小数点演算の大部分がベクトル化されていないことを意味します。コードがベクトル化されない原因を知るには、インテル® Advisor を使用します。
第 2 レベルのメトリックは、特定の精度での浮動小数点ワークの大まかなサイズの見積もりを示し、その精度のベクトル命令の実際の命令長を確認します。部分ベクトル長は、レガシー命令セットの利用に関する情報を示し、最新の命令セットでコードを再コンパイルすることで、パフォーマンスがさらに向上する可能性を示します。関連するメトリックには以下のとおりです。
命令ミックス
メモリーリードまたはライトごとの FP 算術演算命令。
CPU 時間による FPU を使用する上位のループ/関数の表には、CPU 時間でソートされた浮動小数点演算を含む上位の関数が表示され、ベクトル化されたコードの割合、ループ/関数で使用されるベクトル命令セット、およびループタイプを迅速に推測できます。
インテル® Xeon Phi™ プロセッサー開発コード名 Knights Landing では、FLOP カウンターの代わりに次の FPU メトリックを利用できます。
サイクルごとの SIMD 命令
サイクルごとのパックド SIMD 命令とスカラー SIMD 命令の比率
静的解析に基づくループセットのベクトル命令
インテル® Omni-Path ファブリックの使用
インテル® Omni-Path ファブリック (インテル® OP ファブリック) メトリックは、インテル® OP ファブリック・インターコネクトを搭載した計算ノードの解析に利用できます。インターコネクト・ハードウェアの上限に達することが MPI 通信のボトルネックに関連しているか確認するのに役立ちます。ここでは、インターコネクトの使用に関する、帯域幅とパケットレートについて説明します。インターコネクトは双方向であるため、帯域幅とパケットレートのデータはどちらも送信と受信に分割されます。ボトルネックはどちらかの方向に関連している可能性があります。
送信と受信帯域幅依存メトリックは、アプリケーションがインターコネクト帯域幅の上限に接近または到達した通信に費やした経過時間のパーセンテージを示します。
帯域幅利用率分布図は、インターコネクト帯域幅が特定の値 (帯域幅ドメイン) で使用された時間を表し、しきい値により帯域幅利用率を、高、中、低、に分類します。
送信と受信帯域パケットレート・メトリックは、アプリケーションがインターコネクト・パケットレートの上限に接近または到達した通信に費やした経過時間のパーセンテージを示します。
パケットレート分布図は、インターコネクトのパケットレートが特定の値で使用された時間を表し、しきい値により帯域幅利用率を、高、中、低、に分類します。
最適化する関数をダブルクリックして、関連するソースコードのファイルを [ソース/アセンブリー] ウィンドウに表示します。インテル® VTune™ プロファイラーから直接コードエディターを開いてコードを編集できます (例えば、ホットスポット関数の呼び出し回数を最小限に抑えるなど)。
結果が非効率なコア利用率や NUMA の影響を示す場合、スレッドがプロセッサー・コアにピニング (固定) されているか、またはその方法を理解する必要があります。
スレッド・ピニング・アフィニティーは、MPI などの並列ランタイムの環境変数、または並列ランタイムやオペレーティング・システムが提供する API を使用して設定できます。インテル® VTune™ プロファイラー GUI の [スレッド・アフィニティーの収集] またはコマンドラインの -knob collect-affinity=true を使用して、HPC パフォーマンス特性解析向けのアフィニティー収集を有効にします。このオプションを有効にすると、ソケット、物理コア、および論理コアへのスレッドのピニングを示すスレッド・アフィニティー・コマンドライン・レポートを生成できます。アフィニティー情報は、スレッドのライフタイムの最後に収集されるため、結果として得られるデータは、スレッドのライフタイム中に変更された動的なアフィニティーの問題全体を示すものではありません。
プレビューの HTML レポートを利用して、スレッドの CPU での実行とリモートアクセスにおけるプロセス/スレッドのアフィニティーを確認できます。次のコマンドを使用して HTML レポートを生成します。
vtune -report affinity -format=html -r <result_dir>
これは、プレビュー機能です。プレビュー機能は、正式リリースに含まれるかどうか未定です。皆さんが機能に対する有用性のフィードバックを送ることで、将来の採用決定の判断に役立ちます。プレビュー機能で収集されたデータは、将来のリリースで下位互換が提供される保証はありません。parallel.studio.support@intel.com または intelsystemstudio@intel.com へフィードバックをお送りください。
アプリケーションのパフォーマンスに影響するキャッシュ依存およびメモリー依存問題の詳細を確認するには、メモリーアクセス解析を実行します。
インテル® Advisor を使用して、ベクトル処理の最適化のためアプリケーションを解析します。