「パフォーマンス・スナップショット」では、マイクロアーキテクチャーの使用に関する問題について説明しました。チュートリアルのこのステージでは、マイクロアーキテクチャー全般解析を実行して最適化の可能性を探します。
これまでの最適化により、アプリケーションの合計経過時間に大きな利点がもたらされましたが、まだ改善の余地があります。パフォーマンス・スナップショット解析では、マイクロアーキテクチャーが十分に活用されていないことが明らかになりました。
マイクロアーキテクチャー全般解析を実行して、改善の可能性を特定します。
マイクロアーキテクチャー全般解析を実行するには:
パフォーマンス・スナップショット解析ツリーで、[マイクロアーキテクチャー全般解析] アイコンをクリックします。
[どのように] ペインで、すべての追加オプションを有効にします。
[開始] ボタンをクリックして解析を実行します。
アプリケーションが終了すると、インテル® VTune™ プロファイラーはデフォルトで [サマリー] ウィンドウを開きます。
このビューには次の内容が表示されます。
経過時間セクション: このセクションには、ハードウェアのハードウェア利用率のレベルに関連するメトリックが表示されます。フラグが示されたメトリックにマウス移動すると、問題の説明、考えられる原因、問題を解決する提案が表示されます。
[マイクロアーキテクチャー全般] ビューポイントのイベントベースのメトリックの階層は、ハードウェア・アーキテクチャーによって異なります。それぞれのメトリックは、インテル® アーキテクチャーで定義されているイベント比率で、固有の事前定義されたしきい値を持っています。インテル® VTune™ プロファイラーは、それぞれのプログラム単位 (関数など) で収集された比率を解析します。この値がしきい値を超えると、パフォーマンスの問題が生じる可能性があります。
µPipe 分布図: µPipe (マイクロアーキテクチャー・ パイプ) は、非効率なハードウェアの使用を示す CPU マイクロアーキテクチャー・メトリックのグラフィカルな表現を提供します。この図を、出力フローが比率に等しいパイプとして扱います: 実際にリタイアした命令/最大の命令リタイアの可能性 (パイプ効率)。µPipe は、1 つのマイクロオペレーションを処理するのに必要なハードウェア・リソースを表す CPU パイプライン・スロットをベースにしています。通常、各サイクルでは複数のパイプライン・スロットが利用可能です (パイプライン幅)。パイプライン・スロットがリタイアしない場合、これはストールとみなされ、µPipe 分布図では、パイプを狭くして障害として表されます。
µPipe の詳細については、ユーザーガイドのマイクロアーキテクチャー・パイプを参照してください。
効率良い有効 CPU 利用率の分布図: この分布図は、使用可能な論理プロセッサーの経過時間と使用レベルを表し、アプリケーションの実行中に使用された論理プロセッサー数をグラフで表示します。理想的には、グラフの最も高いバーがターゲット利用率のレベルと一致する必要があります。
この場合は、次の指標を観察します。
メモリー依存メトリックが高いため、アプリケーションはメモリーアクセスによって制限されています。
メモリー帯域幅とメモリー・レイテンシーのメトリックが高いことが観察されます。
これらの要素を総合的に考慮すると、アプリケーションにメモリーアクセスの問題があるという結論になります。ただし、この問題は、以前にループ変換を使用して解決されたメモリーアクセスの問題とは若干性質が異なります。
ループ変換が適用される前は、アプリケーションはキャッシュに適さないメモリー・アクセス・パターンに拘束されており、その結果、多数の LLC (最終レベルキャッシュ) ミスが発生していました。その結果、DRAM への要求が頻繁に発生するようになりました。
この場合、メモリー帯域幅メトリックが高いことは、アプリケーションが DRAM 帯域幅の制限を飽和させていることを意味します。DRAM の物理的な能力を向上させる方法はありませんが、アプリケーションを変更して、最終レベルキャッシュをさらに有効活用し、DRAM からのロード回数を減らすことは可能です。
一般的に、ほとんどの開発者は、望ましいパフォーマンスの目標に到達すると、それ以上アプリケーションの最適化を停止します。matrix アプリケーションの最適化によってパフォーマンスが向上し、アプリケーションの経過時間が約 90 秒から約 2.5 秒に短縮されました。
さらに最適化したい場合は、コードを変更してキャッシュ・ブロッキング手法を実装できます。キャッシュ・ブロッキングは、データブロックがキャッシュにロードされ、必要な期間だけ再利用されるようにデータ アクセスを再配置し、DRAM アクセスの数を大幅に削減するアプローチです。
キャッシュ・ブロッキング手法を使用するようにコードを変更するには:
multiply.h ヘッダーファイルの 36 行目を変更します。
#define MULTIPLY multiply2
変更後:
#define MULTIPLY multiply4
変更を保存し、アプリケーションを再コンパイルします。
これにより、multiply.c ソースファイルでキャッシュ・ブロッキング手法を実装する multiply4 関数を使用するようにコードが変更されます。
アプリケーションを再コンパイルしたら、任意の分析を実行してパフォーマンスの向上を確認できます。
次のステップ: 前回の結果と比較します。