このトピックは、自動ルーフライン・グラフを使用して、優先度の高い最適化を決定する方法を紹介するチュートリアルの一部です。
以下のステップを実行します。
このトピックでは、以下について説明します。
ドットの上にある最初のルーフラインが必ずしもボトルネックであるとは限りません。ドットの上のすべてのルーフラインが原因となりえます。
ドットの下のルーフラインがボトルネックになることもありますが、ドットとルーフラインの距離が離れているほど、そのルーフラインがボトルネックになる可能性は低いと考えることができます。
ドットの上の最初のルーフラインが論理的にボトルネックとは考えられない場合、インテル® Advisor のその他の機能、アプリケーションに関する知識を駆使して、ボトルネックが見つかるまで上方向に順にルーフライン・グラフを調査します。
ルーフライン・グラフは、データを入力したら解答が得られるようなユーティリティーではありませんが、コードを最適化するための正しい方向性を示してくれます。
次のいずれかの操作を行います。
スタンドアロン GUI: [File (ファイル)] > [Open (開く)] > [Result (結果)] から Result3.advixeexpz 結果を選択します。
Visual Studio* IDE: [ファイル] > [開く] から 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 のループを表すドットの位置 (赤い点) に注目してください。
ドット位置の考えられる理由の 1 つ: [L3 Bandwidth (L3 帯域幅)] ルーフラインの下にあるため、ループはメモリー帯域幅がボトルネックである可能性があります。
しかし、このサンプルコードではデータセットが L1 キャッシュに収まることが分かっています。次の [L2 Bandwidth (L2 帯域幅)] ルーフラインも原因ではなさそうです。
ドット位置の考えられる理由の 1 つ: その次は [Scalar Add Peak (スカラー加算ピーク)] ルーフラインなので、計算能力がボトルネックである可能性があります。
[Survey Report (サーベイレポート)]を使用して、ループがスカラー (青いアイコン) であることが確認できます。
ループをベクトル化して、メモリーを最適化しないとどうなるでしょうか? 試してみると、結果は、roofline.cpp:151 の main のループ (黄色の点) になります。
[Scalar Add Peak (スカラー加算ピーク)] ルーフラインの上の [L1 Bandwidth (L1 帯域幅)] ルーフラインの近くになりました。
つまり、メモリー帯域幅ではなく、計算能力がボトルネックです。