サマリー

このトピックは、自動ルーフライン・グラフを使用して、優先度の高い最適化を決定する方法を紹介するチュートリアルの一部です。

ルーフライン解析は、ハードウェアで達成可能な最大パフォーマンスに対して、アプリケーションの実際のパフォーマンス演算強度を視覚的に示すオプションの解析です。

[Roofline (ルーフライン)] グラフを使用すると、次のようなことが分かります。

ルーフライン解析はキャッシュを考慮しており、DDR メモリーのトラフィックだけでなく、すべてのメモリー・サブシステムのトラフィックを計測します。シングルスレッド・コードとマルチスレッド・コードの両方に対応しています。

このチュートリアルでは、ベクトル化アドバイザーと C++ サンプル・アプリケーション (roofline_demo_samples) を使用して、以下の操作を行う方法を紹介しました。

ステップ

要約

1.チュートリアルの準備

インテル® Advisor のスタンドアロン GUI を使用する場合: インテル® コンパイラーでリリースモードのターゲット・アプリケーションをビルドし、ターゲットの解析結果を保持する新しいインテル® Advisor プロジェクトを作成して設定します。

Visual Studio* IDE を使用する場合: ターゲット・ソリューションを開いて、インテル® コンパイラーでリリースモードのソリューションをビルドします。

  • ターゲットは、インテル® Advisor が解析可能な実行形式のファイルです。

  • 正確で完全なベクトル化アドバイザーの結果を生成するようにアプリケーションをビルドするには、以下の設定でリリースモードの最適化されたバイナリーをビルドします。

    • /ZI

    • /DEBUG

    • /Qopt-report:5

    • /O2 以上

    • /Qvec

    • /Qsimd

    • /Qopenmp

ステップ 2: ルーフライン解析を実行します。

ルーフライン解析を実行して、[Roofline (ルーフライン)] グラフのデータとコントロールを理解します。

  • ルーフライン解析は、サーベイ解析と続けて実行されるトリップカウント & FLOP 解析の組み合わせです。トリップカウント & FLOP 解析の実行には、サーベイ解析の 3 ~ 4 倍の時間がかかる場合があります。

  • [Roofline (ルーフライン)] グラフの各ドットの大きさと色は、各ループ/関数の相対実行時間を表しています。大きな赤いドットは最も多くの時間を費やしており、小さな緑のドットは実行時間が短いことを示しています。

  • [Roofline (ルーフライン)] グラフの水平ライン (ルーフライン) は、計算能力の上限を示しており、最適化なしではループ/関数のパフォーマンスをこれ以上高めることはできません。

  • [Roofline (ルーフライン)] グラフの斜めのラインはメモリー帯域幅の上限を示しており、最適化なしではこれ以上のパフォーマンスは期待できません。

  • 最上部のルーフラインはマシンの最大能力を示すため、ドットはこれを超えることはできません。そして、すべてのループがマシンの最大能力を利用できるわけではありません。

  • パフォーマンスを最大限に向上させる最良の候補は、最上部の達成可能なルーフラインから最も離れた大きな赤いドットです。

  • [Roofline (ルーフライン)] グラフには、外観を設定したり、興味のあるデータに注目する各種コントロールがあります。

ステップ 3: メモリー帯域幅のボトルネックに注目

結果のスナップショットを開いて、最も興味のある [Roofline (ルーフライン)] グラフのデータに注目して、データを解釈します。

  • メモリー帯域幅のボトルネックは、一般にキャッシュの最適化により解決できます。

  • [Roofline (ルーフライン)] グラフの解釈をサポートするため、インテル® Advisor のほかのビューのデータを確認します。

ステップ 4: 計算能力のボトルネックに注目

結果のスナップショットを開いて、最も興味のある [Roofline (ルーフライン)] グラフのデータに注目して、データを解釈します。

  • 演算強度 ([Roofline (ルーフライン)] グラフの x 軸) = アクセスされるバイトあたりの浮動小数点操作数。すべてのアルゴリズムに演算強度があります。理論的には、このメトリックはアルゴリズム自体の特性であるため、最適化により変化することはありません。つまり、[Roofline (ルーフライン)] グラフ上のドットは、パフォーマンスの変化に応じて上下には移動しますが、左右に移動することはめったにありません。

  • ループを最適化しただけでは、対応するドットを次のルーフラインに移動できません。ループが最適化を上手く利用している必要があります。非効率なベクトル化や孤立した FMA (Fused Multiply Add) を最適化しただけでは十分ではありません。

  • 適切な状況下では、データレイアウトとメモリーアクセスを最適化することで、計算能力とメモリー帯域幅の両方の制限を解決できます。

  • [Recommendations (推奨事項)] タブで how-can-I-fix-this-issue? (解決方法) にあるコード固有の推奨事項を利用できます。

ステップ 5: 実際のボトルネックを特定

結果のスナップショットを開いて、最も興味のある [Roofline (ルーフライン)] グラフのデータに注目して、データを解釈します。

  • ドットの上にある最初のルーフラインが必ずしもボトルネックであるとは限りません。ドットの上のすべてのルーフラインが原因となりえます。

  • ドットの下のルーフラインがボトルネックになることもありますが、ドットとルーフラインの距離が離れているほど、そのルーフラインがボトルネックになる可能性は低いと考えることができます。

  • ドットの上の最初のルーフラインが論理的にボトルネックとは考えられない場合、インテル® Advisor のその他の機能、アプリケーションに関する知識を駆使して、ボトルネックが見つかるまで上方向に順に [Roofline (ルーフライン)] グラフを調査します。

  • [Roofline (ルーフライン)] グラフは、データを入力したら解答が得られるようなユーティリティーではありませんが、コードを最適化するための正しい方向性を示してくれます。