実際のボトルネックを特定

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

以下のステップを実行します。

このトピックでは、以下について説明します。

結果のスナップショットを開く

次のいずれかの操作を行います。

最も興味のあるルーフライン・グラフのデータに注目

  1. 表示の切り替えを使用して、ルーフライン・グラフとサーベイレポートを並べて表示します。

  2. インテル® Advisor ツールバーの [Loops And Functions] フィルター・ドロップダウンから [Loops] を選択します。

    インテル® Advisor: フィルター

  3. ルーフライン・グラフで次の操作を行います。

    • [Use Single-Threaded Loops] チェックボックスをオンにします。

    • インテル® Advisor: ルーフライン・メニュー コントロールをクリックして、すべての SP... ループの [Visibility] チェックボックスをオンにします(このサンプルコードの変数はすべて倍精度であるため、単精度のルーフラインを非表示にします)。

      インテル® Advisor: ルーフライン・メニュー

      [Point Colorization (ポイントの色分け)] セクションで [Colors of Point Weight Ranges] (ポイントの重み範囲の色) を選択して、ランタイム別にドットを色分けします (赤、黄、緑)。

      インテル® Advisor: コントロール をクリックして変更を保存します。

    • インテル® Advisor: ルーフライン数値ズーム・コントロール コントロールをクリックします。x 軸のフィールドで既存の値を Backspace キーで消去し、0.05 と 0.7 を入力します。y 軸のフィールドで既存の値を Backspace キーで消去し、1.0 と 14.8 を入力します。インテル® Advisor: 保存コントロール ボタンをクリックして変更を保存します。

ルーフライン・グラフのデータ解釈

インテル® Advisor: ルーフライン・グラフ

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 帯域幅)] ルーフラインの近くになりました。

つまり、メモリー帯域幅ではなく、計算能力がボトルネックです。