インテル® VTune™ Amplifier 2018 ヘルプ
HPC パフォーマンス特性解析ビューポイントでは、CPU 使用、メモリー効率、および計算集約型アプリケーションやスループット・アプリケーションの浮動小数点の使用率を推測します。計算主体のアプリケーションやスループット・アプリケーションは、経過時間でハードウェア・リソースを効率良く使用する必要があります。アプリケーションのパフォーマンスやランタイムを最適化する出発点として、HPC パフォーマンス特性解析を使用します。
HPC パフォーマンス特性ビューポイントで示されるパフォーマンス・データを解釈するには、次のステップに従います。
ハイブリッド・アプリケーションの基本的なチューニング手順を調査するため、OpenMP* と MPI アプリケーションの解析チュートリアルを使用します。インテル® デベロッパー・ゾーンからチュートリアル (https://software.intel.com/en-us/itac-vtune-mpi-openmp-tutorial-lin (英語)) にアクセスできます。https://software.intel.com/en-us/videos/hpc-applications-need-high-performance-analysis (英語) にあるウェビナーで、HPC パフォーマンス特性解析について詳しく説明しています。
最初に、[Summary (サマリー)] ウィンドウでアプリケーションの実行に関する全般的な情報を確認します。最適化の主要な領域には、経過時間、1 秒の単精度浮動小数点計算数 (SP GFLOPS) が含まれます。倍精度浮動小数点 FLOP は、単精度 FLOPS の解析結果の 2 倍として表されます。赤字のテキストは、最適化の可能性がある場所を示しています。コードをどのように改善するかは、フラグマークにマウスをホバーして説明を表示します。
最適化の前後の結果を比較するため、ベースラインとして経過時間と SP GFLOPS 値を使用します。
[Summary] ウィンドウを見直して、アプリケーションの主な最適化の可能性を見つけます。改善可能なパフォーマンス・メトリックは赤くマークされます。表示される問題には、CPU 使用率、メモリー依存、FPU 使用率、またはこれらの組み合わせが含まれます。以降に、パフォーマンスを改善するために行うべき次のステップを示します。
CPU 使用率
並列領域の時間とシリアル時間を比較します。シリアル領域の時間が長い場合、シリアル実行領域を最小化する方法を探すか、より並列性を高めるか、またはシリアル実行が避けられないように見えるアルゴリズムやマイクロアーキテクチャーをチューニングします。スレッド数の多いマシンのシリアル領域は、潜在的なスケーリングに多大な影響を与えるため (アムダールの法則)、可能な限り最小化すべきです。
インテルの OpenMP* を使用するアプリケーションでは、[OpenMP Potential Gain (OpenMP* による潜在的なゲイン)] を調査してコードの並列領域の OpenMP* 並列化の効率を見積もります。潜在的なゲイン (Potential Gain) メトリックは、実際の測定と並列領域の理想化された実行との経過時間の差を推測します。理想化では、完全にバランスの取れたスレッドと、ワークの調整に OpenMP* ランタイムのオーバーヘッドがないことを仮定します。このデータは、OpenMP* 並列実行を改善することで節約できる最大時間を理解するために使用します。領域の潜在的なゲインが高い場合、領域名のリンクを選択して [Bottom-up (ボトムアップ)] ウィンドウで [OpenMP Region (OpenMP* 領域)] に分類されるグループに切り替えて、詳しく解析することができます。
MPI アプリケーションでは、プロファイルしたノードのランク数で正規化した、通信操作を待機しているランクのスピンに費やされた CPU 時間を示す MPI インバランス・メトリックを確認します。生成されるメトリックの問題検出の説明は、ランクによる最小の MPI ビジー待機時間を基にしています。ランクによる最小 MPI ビジー待機時間が顕著でなければ、最小時間のランクはアプリケーション実行のクリティカル・パスにある可能性が高くなります。この場合、そのランクの CPU 使用率を確認します。
MPI と OpenMP* のハイブリッド・アプリケーションでは、[MPI Rank on Critical Path (クリティカル・パス上の MPI ランク)] のサブセクションに、シリアル時間 (OpenMP* 領域外)、並列領域時間、および OpenMP* によるゲインの可能性など OpenMP* の効率を示すメトリックが示されます。最小 MPI ビジー待機時間が顕著である場合、それはランク間の部分通信方式や他のノードによって引き起こされたインバランスが原因である可能性があります。この場合、インテル® Trace Analyzer & Collector を使用して通信方式の解析を行います。
アプリケーションが OpenMP* や MPI ランタイム・ライブラリーを使用していない場合、[CPU Usage Histogram (CPU 使用率のヒストグラム)] で CPU 使用率レベルごとに分類されたアプリケーションの経過時間を確認します。[Bottom-up] と [Top-down Tree (トップダウン・ツリー)] ウィンドウのデータを参照し、CPU 使用率によってアプリケーションで最も時間を消費している関数を特定します。最適化の候補 (並列化など) として、最も多い CPU 時間と低い CPU 使用率に注目します。
並列領域内で複数のロックが使用されている場合、特定のロックによるパフォーマンスへの影響を調査するため、ロックと待機解析の実行を検討してください。
メモリー依存
高いメモリー依存の値は、実行時間の大部分がデータフェッチで失われていることを示す可能性があります。このセクションは、異なるキャッシュ階層 (L1、L2、L3) で処理されるストールによって失われたサイクルの一部、または DRAM からのデータフェッチを示しています。DRAM アクセスにつながるラストレベル・キャッシュのミスは、レイテンシー依存のストールと比較して特定の最適化を必要とするため、ストールがメモリー帯域幅で制限されているのを区別するのは重要です。インテル® VTune™ Amplifier は DRAM 依存メトリックの問題の説明で、この問題を解決するヒントを示します。このセクションでは、メモリーストールが NUMA の問題に関連するか判断するため、リモートソケットとローカルソケットへのアクセス比率を比較します。
インテル® Xeon Phi™ プロセッサー開発コード名 Knights Landing では、メモリーアクセス効率の算出に必要なメモリーストールを測定する方法がありません。そのため、メモリー関連のストールを含むバックエンド依存のストールは、ハイレベル特殊化メトリックとして示されます。第 2 レベルのメトリックは、特にメモリーアクセス効率に注目します。
高い [L2 Hit Bound (L2 ヒット依存)] または [L2 Miss Bound (L2 ミス依存)] 値は、高い比率でサイクルが L2 ヒットと L2 ミスの処理に費やされていることを示します。
[L2 Miss Bound] メトリックは、ハードウェア・プリフェッチャーによって L2 キャッシュに取り込まれたデータを考慮しません。しかし、あるケースではハードウェア・プリフェッチャーが過度な DRAM/MCDRAM のトラフィックを生成し、帯域幅を飽和させることがあります。[Demand Misses (要求ミス)] と [HW Prefetcher (ハードウェア・プリフェッチ)] メトリックは、ロード要求またはハードウェア・プリフェッチャーによる L2 キャッシュへのすべての取り込みの比率を示します。
高い [DRAM Bandwidth Bound (DRAM 帯域幅依存)] や [MCDRAM Bandwidth Bound (MCDRAM 帯域幅依存)] の値は、経過時間全体が高帯域幅の使用率に費やされたことを示します。高い [DRAM Bandwidth Bound] の値は、(利用可能であれば) 高帯域幅のメモリー (MCDRAM) に割り当て可能なデータ構造を特定するため、メモリーアクセス解析を行う可能性を示唆します。
[Bandwidth Utilization Histogram (帯域幅使用率のヒストグラム)] は、システムの帯域幅が特定の値 (帯域幅ごと) でどれくらい使用されたかを示し、High、Medium、Low として帯域幅使用率を区分するしきい値を表示します。しきい値は最大値を計算するベンチマークを基に設定されます。また、ヒストグラムの下にあるスライドバーを移動してしきい値を設定できます。変更された値はプロジェクト内のすべての結果に適用されます。
[Bottom-up] ウィンドウに切り替えて、最適化の可能性を見つけるためグリッド内の [Memory Bound (メモリー依存)] 行を確認してください。
アプリケーションがメモリー依存である場合、詳細なメトリックを取得するためメモリーアクセス解析を実行し、メモリー・オブジェクトにそれらのメトリックを関連付けることを検討してください。
FPU 使用率
FPU と GFLOPS メトリックは、第 3 世代インテル® Core™ プロセッサー、第 5 世代インテル® プロセッサー、および第 6 世代インテル® プロセッサーでサポートされます。インテル® Xeon Phi™ プロセッサー開発コード名 Knights Landing では、一部の機能がサポートされます。このメトリックは、現在第 4 世代インテル® プロセッサーでは利用できません。システム上で利用されているプロセッサー・ファミリーを確認するには、解析設定ペインの [Details (詳細)] セクションを展開します。
FPU 使用率メトリックは、プログラムがどれくらい浮動小数点ユニットに依存しているかを表し、ベクトル化効率を評価するのに役立ちます。このメトリックが 100% である場合、アプリケーションが各サイクルでハードウェア・プラットフォーム上で利用可能な浮動小数点操作数を最大限に活用していることを意味します。例えば、第 5 世代インテル® プロセッサーでは、単精度の浮動小数点操作の最大数は、サイクルごとに各コアで 32 です (2 FMA ブロックとブロックごとに 8 つの単精度ベクトル長)。
FPU 使用率が低い原因として以下が考えられます。
スカラーまたは部分的なベクトルロードによる非効率なベクトル化されたコード。
アライメントされていないメモリーアクセスによる過度なメモリー操作。
メモリー操作でのストール。例えば、コードが帯域幅依存である場合。
2 番目のレベルのメトリックを使用して、使用率が低い原因が不適切なベクトル化であることを理解します。関連するメトリックには次のものがあります。
Vector Capacity Usage (ベクトル能力の使用)
FP Instruction Mix (FP 命令の混在)
FP Arithmetic Instructions per Memory Read or Write (メモリーリードまたはライトごとの FP 算術命令)
サイクルあたりの SP FLOPs は、メモリー帯域幅依存のコードであることを示します。
CPU タイムテーブルの FPU 使用による上位ループ/関数は、CPU 時間でソートされた浮動小数点操作を含む上位の関数を示しています。[FPU Utilization (FPU 使用率)] の桁は、ループ/関数が帯域幅依存、ベクトル命令セット、スカラーまたはベクトルであるかに基づく説明を表示し、ベクトル命令セットを変更することで解決する、または インテル® Advisor を使用してFPU 使用率を改善するアドバイスを提供します。
インテル® Xeon Phi™ プロセッサー開発コード名 Knights Landing では、FLOP カウンターの代わりに次の FPU メトリックが利用できます。
SIMD Instructions per Cycle (サイクルあたりの SIMD 命令)
Fraction of packed SIMD instructions versus scalar SIMD Instructions per cycle (サイクルごとのパックド SIMD 命令とスカラー SIMD 命令)
Vector instructions for loops set based on static analysis (ループ向けのベクトル命令は静的解析を基にします)
最適化する関数をダブルクリックして、[Source (ソース)]/[Assembly (アセンブリー)] ウィンドウでコードを表示します。インテル® VTune™ Amplifier から直接コードエディターを開き、シリアルコードを編集 (ホットスポット関数への呼び出し回数を最小限にするなど) できます。
アプリケーションのパフォーマンスに影響するキャッシュ依存およびメモリー依存の問題をさらに詳しく表示するには、メモリーアクセス解析を実行します。
インテル® Advisor を使用して、ベクトル化の最適化のためアプリケーションを解析します。