この記事は、インテル® デベロッパー・ゾーンに公開されている「Intel® Advisor Tutorial: Use the Automated Roofline Chart to Make Optimization Decisions」の「Identify the Real Bottlenecks」の日本語参考訳です。
バージョン: 2021.1 (更新日: 12/04/2020)
このトピックは、自動ルーフライン・グラフを使用して、優先度の高い最適化を決定する方法を紹介するチュートリアルの一部です。
以下のステップを実行します。
このトピックでは、以下について説明します。
- ドットの上にある最初のルーフラインが必ずしもボトルネックであるとは限りません。ドットの上のすべてのルーフラインが原因となりえます。
- ドットの下のルーフラインがボトルネックになることもありますが、ドットとルーフラインの距離が離れているほど、そのルーフラインがボトルネックになる可能性は低いと考えることができます。
- ドットの上の最初のルーフラインが論理的にボトルネックとは考えられない場合、インテル® Advisor のその他の機能、アプリケーションに関する知識を駆使して、ボトルネックが見つかるまで上方向に順にルーフラインを調査します。
- ルーフライン・グラフは、データを入力したら解答が得られるようなユーティリティーではありませんが、コードを最適化するための正しい方向性を示してくれます。
結果のスナップショットを開く
次のいずれかの操作を行います。
- スタンドアロン GUI: [File] > [Open] > [Result] から Result3.advixeexpz 結果を選択します。
- Visual Studio* IDE: [File] > [Open] から Result3.advixeexpz 結果を選択します。
最も興味のあるルーフライン・グラフのデータに注目
- 表示の切り替えを使用して、ルーフライン・グラフとサーベイレポートを並べて表示します。
- インテル® Advisor ツールバーの [Loops And Functions] フィルター・ドロップダウンから [Loops] を選択します。
- ルーフライン・グラフで次の操作を行います。
- [Use Single-Threaded Loops] チェックボックスをオンにします。
- コントロールをクリックして、すべての SP… ループの [Visibility] チェックボックスをオンにします (このサンプルコードの変数はすべて倍精度であるため、単精度のルーフラインを非表示にします)。
[Point Colorization] セクションで [Colors of Point Weight Ranges] を選択して、ランタイム別にドットを色分けします (赤、黄、緑)。
をクリックして変更を保存します。
- コントロールをクリックします。x 軸のフィールドで既存の値を Backspace キーで消去し、0.05 と 0.7 を入力します。y 軸のフィールドで既存の値を Backspace キーで消去し、1.0 と 14.8 を入力します。 ボタンをクリックして変更を保存します。
ルーフライン・グラフのデータの解釈
roofline.cpp:138 の main にあるループのドット (赤いドット) は、L3 Bandwidth ルーフラインの下にあるため、メモリー帯域幅のボトルネックである可能性があります。
しかし、このサンプルコードではデータセットが L1 キャッシュに収まることが分かっています。次の L2 Bandwidth ルーフラインも原因ではなさそうです。
その次は Scalar Add Peak ルーフラインなので、計算能力のボトルネックの可能性があります。
サーベイレポートを使用して、ループがスカラー (青いアイコン) であることを簡単に確認できます。
ループをベクトル化して、メモリーを最適化しないとどうなるでしょうか? 試してみると、roofline.cpp:151 の main にあるループ (黄色のドット) は、Scalar Add Peak ルーフラインの上の L1 Bandwidth ルーフラインの近くになりました。
つまり、メモリー帯域幅ではなく、計算能力がボトルネックです。
製品および性能に関する情報
1 性能は、使用状況、構成、その他の要因によって異なります。詳細については、www.Intel.com/PerformanceIndex/ (英語) を参照してください。