この記事は、インテル® デベロッパー・ゾーンに公開されている「Intel® Advisor Tutorial: Use the Automated Roofline Chart to Make Optimization Decisions」の「Summary」の日本語参考訳です。
バージョン: 2021.1 (更新日: 12/04/2020)
このトピックは、自動ルーフライン・グラフを使用して、優先度の高い最適化を決定する方法を紹介するチュートリアルの一部です。
ルーフライン解析は、マシンで達成可能な最大パフォーマンスに対して、アプリケーションの実際のパフォーマンスと演算強度を視覚的に示すオプションの解析です。
ルーフライン・グラフは、次の質問に対する答えを提供します。
- 現在のハードウェア・リソースで達成可能な最大パフォーマンスは?
- アプリケーションは現在のハードウェア・リソースで最適に動作するか?
- そうでない場合、最適化の最良の候補は?
- メモリー帯域幅や計算能力が各最適化候補のパフォーマンスを制限しているか?
ルーフライン解析はキャッシュを考慮しており、DDR メモリーのトラフィックだけでなく、すべてのメモリー・サブシステムのトラフィックを計測します。シングルスレッド・コードとマルチスレッド・コードの両方に対応しています。
このチュートリアルでは、ベクトル化アドバイザーと C++ サンプル・アプリケーション (roofline_demo_samples) を使用して、以下の操作を行う方法を紹介しました。
- ルーフライン解析の実行
- 最も興味のあるルーフライン・グラフのデータに注目
- ルーフライン・グラフのデータの解釈
- ルーフライン・グラフのデータを基に最適化の方針を決定
ステップ |
要約 |
ステップ 1. チュートリアルの準備
インテル® Advisor のスタンドアロン GUI を使用する場合: インテル® コンパイラーでリリースモードのターゲット・アプリケーションをビルドし、ターゲットの解析結果を保持する新しいインテル® Advisor プロジェクトを作成して設定します。
Visual Studio* IDE を使用する場合: ターゲット・ソリューションを開いて、インテル® コンパイラーでリリースモードのソリューションをビルドします。 |
- ターゲットは、インテル® Advisor が解析可能な実行形式のファイルです。
- 正確で完全なベクトル化アドバイザーの結果を生成するようにアプリケーションをビルドするには、以下の設定でリリースモードの最適化されたバイナリーをビルドします。
- /ZI
- /DEBUG
- /Qopt-report:5
- /O2 以上
- /Qvec
- /Qsimd
- /Qopenmp
|
ステップ 2: ルーフライン解析の実行
ルーフライン解析を実行して、ルーフライン・グラフのデータとコントロールを理解します。 |
- ルーフライン解析は、サーベイ解析と続けて実行されるトリップカウント & FLOP 解析の組み合わせです。トリップカウント & FLOP 解析の実行には、サーベイ解析の 3 ~ 4 倍の時間がかかる場合があります。
- ルーフライン・グラフの各ドットの大きさと色は、各ループ/関数の相対実行時間を表しています。大きな赤いドットは最も多くの時間を費やしており、小さな緑のドットは実行時間が短いことを示しています。
- ルーフライン・グラフの水平ライン (ルーフライン) は、計算能力の上限を示しており、最適化なしではループ/関数のパフォーマンスをこれ以上高めることはできません。
- ルーフライン・グラフの斜めのラインはメモリー帯域幅の上限を示しており、最適化なしではこれ以上のパフォーマンスは期待できません。
- 最上部のルーフラインはマシンの最大能力を示すため、ドットはこれを超えることはありません。また、すべてのループがマシンの最大能力を利用できるわけではありません。
- パフォーマンスを最大限に向上させる最良の候補は、最上部の達成可能なルーフラインから最も離れた大きな赤いドットです。
- ルーフライン・グラフには、外観を設定したり、興味のあるデータに注目する各種コントロールがあります。
|
ステップ 3: メモリー帯域幅のボトルネックへの対応
結果のスナップショットを開いて、最も興味のあるルーフライン・グラフのデータに注目して、データを解釈します。 |
- メモリー帯域幅のボトルネックは、一般にキャッシュの最適化により解決できます。
- ルーフライン・グラフの解釈をサポートするため、インテル® Advisor のほかのビューのデータを確認します。
|
ステップ 4: 計算能力のボトルネックへの対応
結果のスナップショットを開いて、最も興味のあるルーフライン・グラフのデータに注目して、データを解釈します。 |
- 演算強度 (ルーフライン・グラフの x 軸) = アクセスされるバイトあたりの浮動小数点操作数。すべてのアルゴリズムに演算強度があります。理論的には、このメトリックはアルゴリズム自体の特性であるため、最適化により変化しません。つまり、ルーフライン・グラフ上のドットは、パフォーマンスの変化に応じて上下には移動しますが、左右に移動することはめったにありません。
- ループを最適化しただけでは、対応するドットを次のルーフラインに移動できません。ループが最適化を上手く利用している必要があります。非効率なベクトル化や孤立した FMA (Fused Multiply Add) を最適化しただけでは十分ではありません。
- 適切な状況下では、データレイアウトとメモリーアクセスを最適化することで、計算能力とメモリー帯域幅の両方の制限を解決できます。
- [Recommendations] タブで「how-can-I-fix-this-issue?」にあるコード固有の推奨事項を利用できます。
|
ステップ 5: 実際のボトルネックの特定
結果のスナップショットを開いて、最も興味のあるルーフライン・グラフのデータに注目して、データを解釈します。 |
- ドットの上にある最初のルーフラインが必ずしもボトルネックであるとは限りません。ドットの上のすべてのルーフラインが原因となりえます。
- ドットの下のルーフラインがボトルネックになることもありますが、ドットとルーフラインの距離が離れているほど、そのルーフラインがボトルネックになる可能性は低いと考えることができます。
- ドットの上の最初のルーフラインが論理的にボトルネックとは考えられない場合、常識やインテル® Advisor のその他の機能、アプリケーションに関する知識を駆使して、ボトルネックが見つかるまで上方向に順にルーフラインを調査します。
- ルーフライン・グラフは、データを入力したら解答が得られるユーティリティーではありませんが、コードを最適化するための正しい方向性を示してくれます。
|
製品および性能に関する情報
1 性能は、使用状況、構成、その他の要因によって異なります。詳細については、www.Intel.com/PerformanceIndex/ (英語) を参照してください。