< 目次

GPU ルーフライン・グラフのボトルネックを調査

GPU ルーフラインの調査パースペクティブを使用すると、[GPU Roofline Regions (GPU ルーフライン領域)] ビューのルーフライン・グラフ上にプロットされたハードウェアの最大能力との位置関係でアプリケーションのパフォーマンスを表現できます。

インテル® Arc™ Alchemist (DG2) 以降のインテル® Xe グラフィックス製品ファミリーと以降の世代では、従来の用語から GPU アーキテクチャーの用語が変更されています。用語変更の詳細と、従来のコンテンツとの対応については、インテル® Xe グラフィックスの GPU アーキテクチャー用語を参照してください。

パフォーマンスを制限する要因を調査

インテル® Advisor は、ハードウェアの最大演算能力と最大メモリー帯域幅をルーフライン・グラフに視覚化します。

ホットスポットを特定して最適化の余地を推測

アムダールの法則に従って、プログラムの合計実行時間の大半を占めるループを最適化することで、実行時間が短いループを最適化するよりも大幅な効果が期待できます。インテル® Advisor を使用すると、合計時間の大部分を要しているカーネル (ホットスポット) を特定できます。最適化の候補を見つけるには、ルーフライン・グラフ上のドット (点) に注目してください。ドットは、GPU で実行されるカーネルに対応します。ドットの大きさと色は、ドットやポイントの重みによって異なります。ポイントの重みは、プログラムの合計時間に対するドットに消費した時間のパーセンテージであり、ドットのセルフ経過時間 / プログラムの合計経過時間 * 100 として計算されます。デフォルトでは、ドットの大きさと色は次のように定義されます。

ドットの実行時間のレンジ、大きさ、色をカスタマイズするには、[ルーフライン・グラフ] の ボタンをクリックして、[Loop Weight Representation (ループの重み表現)] メニューを開きます。

最良の最適化の候補は、最上部のルーフラインから最も離れた最も大きなドット (デフォルトでは赤のドット) です。その理由は以下のとおりです。

特定のカーネルの最適化の余地を特定するには、グラフ上のドットをダブルクリックして、パフォーマンスを制限するルーフをハイライト表示します。ドットの上部にあるルーフは、パフォーマンスの向上を妨げる要因を表わします。ドットは、ハードウェアの最大能力を示す最上位のルーフラインを超えることはありません。ドットが最上部のルーフから離れるほど、改善の余地は大きくなります。

選択したドットにマウスを移動すると、制限を受けるルーフが示され、このカーネルを最適化することで推測されるスピードアップが示されます。

GPU ルーフライン・グラフの例

マルチタイル GPU にも同様のアプローチが使用され、ルーフライン・グラフで各 GPU タイルが示されます。例えば、2 つのタイルを持つマルチタイル GPU の場合、ルーフライン・グラフには 2 つのドット (タイルごとに 1 つのドット) が表示されます。タイルのパフォーマンスが同等であれば、ドットはグラフ上の同じ場所にあるか、互いに非常に近い位置にある可能性があります。ドット間に距離がある場合は、次を考慮してください。

各タイルの詳細を表示するには、ホットスポットを展開します。例えば、[Source and Assembly (ソースとアセンブリー)] ビューに切り替えて、GPU タイルと GPU デバイスの詳細情報を調べることができます。

この解析を使用すると、不均衡な操作を修正し、すべての GPU タイルを中央のゾーンに配置して、より効率的に実行されていることを示すことができます。

異なるメモリーレベルでのカーネルのパフォーマンスを調査

デフォルトでは、インテル® Advisor はすべてのメモリーレベルのデータを収集します。これにより、それぞれのキャッシュレベルと演算強度で各ループを調査することができ、どのキャッシュレベルがパフォーマンスのボトルネックであるか正確に理解できます。

メモリーレベルのルーフライン・グラフを設定

  1. GPU ルーフライン・グラフ・ツールバーのフィルターペインを展開します。
  2. [Memory Level (メモリーレベル)] セクションで、メトリックを表示するメモリーレベルを選択します。

    GPU ルーフライン・グラフのメモリーレベルを選択

    デフォルトでは、GPU ルーフラインは GTI メモリーレベル (統合グラフィックス) と HBM/DRAM メモリーレベル (ディスクリート・グラフィックス) のデータをレポートします。
  3. [Apply (適用)] をクリックします。

メモリーレベルの GPU ルーフライン・データを解釈

グラフ上のドットをダブルクリックすると、表示されているメモリーレベル間のトラフィックの変化を確認および比較し、メモリー階層のボトルネックを特定して、カーネルのパフォーマンスを最も制限するルーフをハイライトします。この情報から最適化の手順を決定できます。ラベルが付いたドットや X マークが表示され、次のメモリーレベルで選択されたカーネルの演算強度とメモリーレベルを表わします。

  • CARM: すべての実行ユニット (EU) で発生するメモリー・トラフィック。EU と対応する GPU キャッシュ間のトラフィック、またはメインメモリーへの直接トラフィックが含まれます。メモリー引数を持つリタイア済みの命令では、それぞれのメモリーオペランドのサイズ (バイト単位) がこのメトリックに追加されます。
  • L3: 実行ユニットと L3 キャッシュ間で直接転送されたデータ。
  • SLM: L3 キャッシュ内の専用構造である共有ローカルメモリー (SLM) との間のメモリーアクセス。
  • HBM: 現在使用しているグラフィックス・ハードウェアで利用可能な HBM メモリーの最大帯域幅を示します。最適化されたロード命令のシーケンスを使用して、ディスクリート GPU キャッシュに収まらない配列を反復処理して測定します。
  • GTI: GPU、チップのアンコア (LLC) および統合 GPU のメインメモリー間の GPU メモリーリード帯域幅。これにより外部メモリー・トラフィックを判別できます。
  • DRAM: 現在の GPU で利用可能な最大 DRAM メモリー帯域幅。DRAM ルーフは、最適化されたロード命令のシーケンスを使用して、GPU キャッシュに収まらない配列を反復処理して測定します。ルーフの上限は、GPU、チップのアンコア (LLC)、およびディスクリート GPU 上のメインメモリー間の最大帯域幅を表わします。

すべてのメモリーレベルの GPU ルーフライン・グラフの例

メモリードットとそれぞれのルーフライン間の垂直距離は、特定のメモリー・サブシステムによって制限される度合いを示します。ドットがルーフラインに近い場合、カーネルはそのメモリーレベルの帯域幅で制限されていることを意味します。

メモリードットの水平距離は、カーネルがキャッシュをどのくらい効率良く使用しているかを示します。例えば、L3 と GTI のドットが 1 つのカーネルの水平軸上で隣接している場合、カーネルは同様に L3 と GTI を使用します。これは、L3 と GTI が効率良く利用されていないことを意味します。コード内のデータ再利用を改善して、アプリケーションのパフォーマンスを向上します。

x 軸の演算強度はドットが表示される順番を決定し、コードのパフォーマンスを視覚的に理解できます。例えば、CARM のドットは通常、L3 ドットの右側にあります。これは、読み取り/書き込みアクセスがキャッシュライン単位であり、CARM トラフィックは実際に操作されるバイト数の合計であるためです。最適化の可能性を特定するには、特定のカーネルの L3 キャッシュライン利用率メトリックを確認します。L3 キャッシュラインが十分に活用されていない場合、カーネルのメモリー・アクセス・パターンをチェックして、経過時間を短縮します。

理想的には、CARM ドットと L3 ドットが隣接して配置され、GTI ドットがそれらの右側にある必要があります。この場合、カーネルは適切なメモリー・アクセス・パターンを持っており、L3 キャッシュを活用しています。カーネルが L3 キャッシュラインをうまく活用できると次のことが当てはまります。

  • L3 メモリーレベルと CARM メモリーレベル間のデータ転送にかかる時間が短縮されます
  • 実際の計算では可能な限り多くのデータを使用します
  • カーネルとアプリケーション全体の経過時間を短縮します

カーネルが計算依存であるかメモリー依存であるかを判断します

選択したカーネルが計算依存であるかメモリー依存であるかを判断するには、[GPU Details (GPU 詳細)] タブの [Roofline Guidance (ルーフラインのガイド)] セクションにあるデータを参照して、選択したカーネルのルーフライン・グラフを調べます。

このグラフは、コード内の主要な操作タイプ (FLOAT または INT) を示しており、カーネルで使用されるキャッシュ・メモリー・レベル、データタイプ、および命令ミックスのルーフのみを表わしています。カーネルに FLOP または INT 操作がない場合、そのカーネルはグラフ上に示されません。

例えば、以下に示すスクリーンショットのカーネルはメモリー依存です。カーネルはほかのメモリーレベルと比較して大量のデータ (6.88 GB) を転送するのにこのメモリーレベルを使用するため、パフォーマンスは L3 帯域幅によって制限されます。カーネル内のメモリー・アクセス・パターンを最適化することで、最大 5.1 倍のスピードアップを達成できます。

単一カーネルの GPU ルーフラインは、カーネルのパフォーマンスを制限する Int32 ベクトル加算ピークを指しています

計算タスクのパフォーマンスを調査

グローバルおよびローカルのワークサイズが異なる同一カーネルでの初期化は、計算タスクと呼ばれます。異なるグローバルおよびローカルのワークサイズで初期化されたカーネルは、計算タスクのパフォーマンスを確認または比較できます。

GPU アダプターと GPU スタック (タイル) に関する情報も調査できます。マルチタイルおよびマルチ GPU システムの場合、インテル® Advisor は、このパフォーマンス・データを GPU タイルごとに 1 つのテーブル行で表示します。各 GPU タイルのパフォーマンス・データを表示するには、対応する GPU の [GPU Adapter (GPU アダプター)] カラムと [GPU Stack (GPU スタック)] カラムを調べます。例えば、タスクが 2 つのタイルで実行されている場合、ターゲット GPU カーネルを含む行を見つけて展開し、これらのタイルに対応する 2 行のデータを調べます。

現在、ユーザーはこの詳細情報をレポートから除外することはできません。

依存関係ビューには複数のタイルのデータも表示されます: GPU ルーフライン・グラフ、GPU ソース、GPU アセンブリー、命令ミックスを含む GPU の詳細。

グラフ上のドットを選択すると、グリッド内のそれぞれのカーネルがハイライト表示されます。

トップペインで ボタンを使用して、メインビューに [CPU ルーフライン] ペインを追加できます。CPU ルーフラインのデータの詳細は、CPU / メモリー・ルーフラインの調査パースペクティブをご覧ください。

次のステップ

GPU ルーフラインの調査レポートの [GPU Details (GPU 詳細)] タブを使用して、各カーネルに関連する詳細情報を調べ、カーネルコードの最適化に関する推奨事項を取得します。

関連情報