インテル® Advisor チュートリアル: ルーフライン解析の実行

この記事は、インテル® デベロッパー・ゾーンに公開されている「Intel® Advisor Tutorial: Use the Automated Roofline Chart to Make Optimization Decisions」の「Run a Roofline Analysis」の日本語参考訳です。


バージョン: 2021.1 (更新日: 12/04/2020)

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

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

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

  • ルーフライン解析は、サーベイ解析と続けて実行されるトリップカウント & FLOP 解析の組み合わせです。トリップカウント & FLOP 解析の実行には、サーベイ解析の 3 ~ 4 倍の時間がかかる場合があります。
  • ルーフライン・グラフの各ドットの大きさと色は、各ループ/関数の相対実行時間を表しています。大きな赤いドットは最も多くの時間を費やしており、小さな緑のドットは実行時間が短いことを示します。
  • ルーフライン・グラフの水平ライン (ルーフライン) は、計算能力の上限を示しており、最適化なしではループ/関数のパフォーマンスをこれ以上高めることはできません。
  • ルーフライン・グラフの斜めのラインはメモリー帯域幅の上限を示しており、最適化なしではこれ以上のパフォーマンスは期待できません。
  • 最上部のルーフラインはマシンの最大能力を示すため、ドットはこれを超えることはありません。また、すべてのループがマシンの最大能力を利用できるわけではありません。
  • パフォーマンスを最大限に向上させる最良の候補は、最上部の達成可能なルーフラインから最も離れた大きな赤いドットです。
  • ルーフライン・グラフには、外観を設定したり、興味のあるデータに注目するための各種コントロールがあります。

ルーフライン解析の実行

[Vectorization Workflow] ペインで [Run Roofline] の下にある インテル® Advisor コントロール: [Run Roofline] コントロールをクリックして、ターゲット・アプリケーションを 2 回実行します。

  • サーベイ解析でマシンのハードウェア制限を測定し、ループ/関数のタイミング情報を収集します。
  • トリップカウント & FLOP 解析で FLOP データを収集します。この収集には、サーベイ解析の 3 ~ 4 倍の時間がかかります。

完了すると、インテル® Advisor は ルーフライン・グラフを表示します。


Visual Studio* IDE に [Workflow] が表示されない場合: インテル® Advisor ツールバーの インテル® Advisor ツールバーアイコン アイコンをクリックします (表示には数秒かかる場合があります)。

ルーフライン・グラフの表示/非表示

ルーフライン・グラフを表示/非表示にするコントロールがいくつかあります。

インテル® Advisor: ルーフライン・グラフとサーベイレポート

1   クリックして、ルーフライン・グラフとサーベイレポートの表示を切り替えます。
2   クリックして、ルーフライン・グラフとサーベイレポートを並べて表示/個別に表示します。
3   ドラッグして、ルーフライン・グラフとサーベイレポートのサイズを調整します。

ヒント
このチュートリアルの以降の説明では、ルーフライン・グラフとサーベイレポートを並べて表示します。

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

ルーフライン・グラフは、マシンの達成可能な最大パフォーマンスに対して、アプリケーションの実際のパフォーマンス演算強度を視覚的に示します。

  • 演算強度 (x 軸) – ループ/関数のアルゴリズムを基に、CPU/GPU とメモリー間で転送された 1 バイトあたりの浮動小数点操作数 (FLOPs) または整数操作数 (INTOPs) で測定されます。
  • パフォーマンス (y 軸) – 1 秒あたりの 10 億浮動小数点演算数 (GFLOPS) または 10 整数演算数 (GINTOPS) で測定されます。

一般に、以下のことが言えます。

  • ルーフライン・グラフの各ドットの大きさと色は、各ループ/関数の相対実行時間を表しています。大きな赤いドットは最も多くの時間を費やしているため、最適化の最良の候補です。小さな緑のドットは実行時間が短いため、最適化の労力が無駄になるかもしれません。

  • ルーフライン・グラフの斜めのラインはメモリー帯域幅の上限を示しており、最適化なしではこれ以上のパフォーマンスを達成することはできません。例えば、L1 Bandwidth ルーフラインは、ループが常に L1 キャッシュにヒットする場合にある演算強度で実行できる最大作業量を示します。ループは、データセットが L1 キャッシュを頻繁にミスする場合、L1 キャッシュの速度の恩恵を受けられず、代わりに低速な L2 キャッシュにより制限されます。L1 キャッシュを頻繁にミスして L2 キャッシュにヒットするループのドットは、L2 Bandwidth ルーフラインの下に表示されます。
  • ルーフライン・グラフの水平ライン (ルーフライン) は、計算能力の上限を示しており、最適化なしではループ/関数のパフォーマンスをこれ以上向上することはできません。例えば、Scalar Add Peak は、この状況下でスカラーループが実行可能な加算命令の最大数を示します。Vector Add Peak は、この状況下でベクトルループが実行可能な加算命令の最大数を示します。そのため、ベクトル化されていないループのドットは、Scalar Add Peak ルーフラインの下に表示されます。
  • 最上部のルーフラインはマシンの最大能力を示すため、ドットはこれを超えることはありません。また、すべてのループがマシンの最大能力を利用できるわけではありません。
  • ドットと最上部の達成可能なルーフラインの間の距離が大きいほど、パフォーマンス向上の可能性が高くなります。

以下のルーフライン・グラフでは、ループ A と G (大きな赤いドット)、そして B (ルーフから離れている黄色のドット) が最適化の最良の候補です。ループ C、D、E (小さな緑のドット) と H (黄色のドット) は、パフォーマンス向上の余地があまりないか、パフォーマンスに大きな影響を与えるには小さすぎるため候補にはなりません。

これは、ルーフライン・グラフの実際のスクリーンショットではなく、ビジュアルモデルです。


ルーフライン・グラフとサーベイレポートは同期されています。ルーフライン・グラフのドットをクリックすると、サーベイレポートで対応するデータ行がハイライト表示され、サーベイレポートでデータ行をシングルクリックすると、ループに浮動小数点操作が含まれていればルーフライン・グラフで対応するドットが点滅します。浮動小数点操作を含まないループはルーフライン・グラフに表示されません。

ルーフライン・グラフで各ルーフライン (ライン)、ピーク (長方形)、ループ (ドット) にマウスのカーソルを合わせると、各要素の説明が表示されます。

ルーフライン・グラフのコントロールの理解

以下を含む、いくつかのコントロールを利用してルーフライン・グラフの重要なデータに注目できます。

インテル® Advisor のキャッシュを意識したルーフライン・グラフ

1  
  • Select Loops by Mouse Rect: マウスで長方形を描いて、その範囲内にある 1 つ以上のループ/関数を選択します。
  • Zoom by Mouse Rect: マウスで長方形を描いて、その範囲を拡大/縮小します。マウスホールで拡大/縮小することもできます。
  • Move View By Mouse: マウスでグラフを前後左右に移動します。
  • Undo/Redo: 直前のズーム操作を取り消し/やり直します。
  • Cancel Zoom: デフォルトの倍率にリセットします。
  • Export as x: インテル® Advisor のビューアーがなくても表示可能な、ダイナミックでインタラクティブな HTML または SVG ファイル形式でグラフをエクスポートします。ドロップダウンで出力ファイル形式を切り替えます。
2   [Cores] ドロップダウン・ツールバーを使用して、以下を行うことができます。
  • ルーフラインを調整して、ホストマシン上でのコードの実用的なパフォーマンスの上限を確認します。
  • シングルスレッド・アプリケーション (または、ランクあたり 1 スレッドの MPI アプリケーションのように、シングルスレッドで実行するように設定されたマルチスレッド・アプリケーション) のルーフを構築します (インテル® Advisor のフィルターを使用してルーフライン・グラフに表示されるループを制御できますが、ルーフライン・グラフでは [Threads] フィルターをサポートしていません)。

適切な CPU コア数を選択して、ルーフの値を増減できます。

  • 1 – コードがシングルスレッドの場合
  • スレッド数と同じまたはほぼ同じコア数 – コードのスレッド数が利用可能な CPU コア数よりも少ない場合
  • 最大コア数 – コードのスレッド数が利用可能な CPU コア数よりも多い場合

デフォルトでは、コア数はアプリケーションで使用されるスレッド数 (偶数値) に設定されています。

コードをマルチソケット PC で実行する場合、次のオプションが表示されます。

  • アプリケーションがメモリーを 1 つのソケットにバインドする場合、[Bind cores to 1 socket] を選択します (デフォルト)。例えば、ソケットごとに 1 ランクの MPI アプリケーションでは、このオプションを使用します。


    1 つのソケットで利用可能な最大コア数を超える CPU コア数を選択する場合、このオプションは無効になることがあります。

  • アプリケーションがメモリーをすべてのソケットにバインドする場合、[Spread cores between all n sockets] を選択します。例えば、MPI 以外のアプリケーションではこのオプションを選択します。
3  
  • 浮動小数点操作 (FLOP)、整数操作 (INT)、ミックス (FLOP + INT) の表示を切り替えます。
  • コールスタック付きでルーフラインを収集した場合: ルーフライン・グラフにコールスタック付きのルーフラインを表示できます。
4   比較のため、インテル® Advisor のほかの結果やアーカイブされていないスナップショットからルーフライン・グラフのデータを表示します。

ドロップダウン・ツールバーを使用して、次の操作を行うことができます。

  • 結果/スナップショットをロードして、対応するファイル名を [Compared Results] 領域に表示します。
  • 選択されている結果/スナップショットをクリアして、対応するファイル名を [Ready for comparison] 領域に移動します。


    結果/スナップショットをリロードするには、[Ready for comparison] 領域のファイル名をクリックします。

  • 比較結果をファイルに保存します。


    比較ファイルをアップロードしても、ループ/関数の関係を示す矢印のラインは表示されません。

現在の結果でループ/関数のドットをクリックすると、そのドットとロードされた結果/スナップショットにある対応するループ/関数のドットの関係 (矢印のライン) が表示されます。

インテル® Advisor: [Roofline Comparison]

5   ルーフライン・グラフにビジュアル・インジケーターを追加して、パフォーマンスの制限や、ループ/関数がメモリー依存か、計算依存か、あるいは両方かなど、データを解釈しやすくします。

ドロップダウン・ツールバーを使用して、次の操作を行うことができます。

  • [Display roof rulers] チェックボックスをオンにして、ループ/関数から最も近い、最上部のルーフラインへ垂直のラインを表示します。ルーラーを表示するには、ループ/関数にホバーします。ラインと各ルーフが交差する場所では、そのループ/関数のハードウェア・パフォーマンスの上限がラベルで表示されます。
  • すべてのメモリーレベルのルーフラインを収集した場合: [Show memory level relationships] チェックボックスをオンにすると、表示されているメモリーレベルとルーフ、および選択したループ/関数のドットの関係が視覚的に強調されます。
  • [Show Roofline boundaries] チェックボックスをオンにして、ループ/関数がメモリー依存か、計算依存か、あるいは両方かを分かりやすくするため、ルーフラインのゾーンを色分けします。

ガイダンスオプションを選択するとプレビュー画像が更新され、変更内容をルーフライン・グラフの外観に反映した状態を確認できます。変更を適用するには [Apply] をクリックし、ルーフライン・グラフの外観をデフォルトの状態に戻すには [Default] をクリックします。

ループ/関数のドットがハイライト表示されたら、ループ/関数をもう一度ダブルクリックするか、ループ/関数を選択した状態でスペースキーまたは Enter キーを押して、選択したループ/関数のドットにルーフライン・グラフをズームできます。オリジナルのルーフライン・グラフ表示に戻るまでこのアクションを繰り返します。

ラベル付けされたドットを非表示にするには、別のループ/関数を選択するか、ルーフライン・グラフの空白の領域をダブルクリックします。

6  
  • Roofline View Settings: デフォルトの倍率設定を調整します。
    • ルーフライン・グラフごとに最適な倍率
    • すべてのルーフライン・グラフに適した倍率
  • Roofs Settings: ルーフライン (ライン) の表示/非表示と外観を変更します。
    • マルチスレッドではなく、シングルスレッドのベンチマーク結果に基づいてルーフ値を計算できるようにします。
    • [Visible] チェックボックスをクリックして、ルーフラインを表示/非表示にします。
    • [Selected] チェックボックスをクリックして、ルーフラインの外観 (実線または破線) を変更します。
    • [Value] 列でルーフ値を手動で微調整して、コードのハードウェア制限を設定できます。
  • Loop Weight Representation: ループ/関数の重み (ドット) の外観を変更します。
    • Point Weight Calculation: ループ/関数の重み計算の基本値を変更します。
    • Point Weight Ranges: ループ/関数のドットのサイズ、重みの範囲を変更します。[+] ボタンをクリックするとループの重み範囲が 2 分割され、[-] ボタンをクリックするとループの重み範囲が下の範囲とマージされます。
    • Point Colorization: 重み範囲やタイプ (ベクトルまたはスカラー) でループ/関数のドットを色分けします。セルフ時間のないループの色を変更することもできます。

ルーフの設定やドットの重み表現の設定を JSON ファイルに保存したり、カスタム設定をロードできます。

7   数値を使用して拡大/縮小できます。
8   ループ/関数のドットをクリックして、次の操作を行うことができます。
  • 黒枠を表示します。
  • ループ/関数のメトリックを表示します。
  • ほかのウィンドウタブで対応するデータを表示します。

ループ/関数のドットか、ルーフライン・グラフの空白の領域を右クリックして、以下のような操作を行うことができます。

  • フィルターアウト (ドットを一時的に非表示) やフィルターイン (ほかのすべてのドットを一時的に非表示) によりルーフライン・グラフを簡素化したり、フィルターをクリア (すべてのドットを表示) できます。
  • クリップボードにデータをコピーします。
9   メトリックペインを表示/非表示にします。
  • [Point Info] ペインで基本的なパフォーマンス・メトリックを確認します。
  • すべてのメモリーレベルのルーフラインを収集した場合: [Memory Metrics] ペインで、ループ/関数のキャッシュ利用効率と、ループ/関数が依存しているメモリーレベルを確認します。
10 各ループの重み表現カテゴリーのループの数と割合を表示します。

このチュートリアルの以降の説明では、時間とハードウェア依存性を考慮して、事前に収集された解析結果を使用します。


製品および性能に関する情報

1 性能は、使用状況、構成、その他の要因によって異なります。詳細については、www.Intel.com/PerformanceIndex/ (英語) を参照してください。

関連記事