GPU ルーフラインの調査パースペクティブを使用すると、[GPU Roofline Regions (GPU ルーフライン領域)] ビューのルーフライン・グラフ上にプロットされたハードウェアの最大能力との位置関係でアプリケーションのパフォーマンスを表現できます。
インテル® Advisor は、ハードウェアの最大演算能力と最大メモリー帯域幅をルーフライン・グラフに視覚化します。
アムダールの法則に従って、プログラムの合計実行時間の大半を占めるループを最適化することで、実行時間が短いループを最適化するよりも大幅な効果が期待できます。インテル® Advisor を使用すると、合計時間の大部分を要しているカーネル (ホットスポット) を特定できます。最適化の候補を見つけるには、ルーフライン・グラフ上のドット (点) に注目してください。ドットは、GPU で実行されるカーネルに対応します。ドットの大きさと色は、ドットやポイントの重みによって異なります。ポイントの重みは、プログラムの合計時間に対するドットに消費した時間のパーセンテージであり、ドットのセルフ経過時間 / プログラムの合計経過時間 * 100 として計算されます。デフォルトでは、ドットの大きさと色は次のように定義されます。
最良の最適化の候補は、最上部のルーフラインから最も離れた最も大きなドット (デフォルトでは赤のドット) です。その理由は以下のとおりです。
特定のカーネルの最適化の余地を特定するには、グラフ上のドットをダブルクリックして、パフォーマンスを制限するルーフをハイライト表示します。ドットの上部にあるルーフは、パフォーマンスの向上を妨げる要因を表わします。ドットは、ハードウェアの最大能力を示す最上位のルーフラインを超えることはありません。ドットが最上部のルーフから離れるほど、改善の余地は大きくなります。
選択したドットにマウスを移動すると、制限を受けるルーフが示され、このカーネルを最適化することで推測されるスピードアップが示されます。
マルチタイル GPU にも同様のアプローチが使用され、ルーフライン・グラフで各 GPU タイルが示されます。例えば、2 つのタイルを持つマルチタイル GPU の場合、ルーフライン・グラフには 2 つのドット (タイルごとに 1 つのドット) が表示されます。タイルのパフォーマンスが同等であれば、ドットはグラフ上の同じ場所にあるか、互いに非常に近い位置にある可能性があります。ドット間に距離がある場合は、次を考慮してください。
各タイルの詳細を表示するには、ホットスポットを展開します。例えば、[Source and Assembly (ソースとアセンブリー)] ビューに切り替えて、GPU タイルと GPU デバイスの詳細情報を調べることができます。
この解析を使用すると、不均衡な操作を修正し、すべての GPU タイルを中央のゾーンに配置して、より効率的に実行されていることを示すことができます。
デフォルトでは、インテル® Advisor はすべてのメモリーレベルのデータを収集します。これにより、それぞれのキャッシュレベルと演算強度で各ループを調査することができ、どのキャッシュレベルがパフォーマンスのボトルネックであるか正確に理解できます。
メモリーレベルのルーフライン・グラフを設定
メモリーレベルの GPU ルーフライン・データを解釈
グラフ上のドットをダブルクリックすると、表示されているメモリーレベル間のトラフィックの変化を確認および比較し、メモリー階層のボトルネックを特定して、カーネルのパフォーマンスを最も制限するルーフをハイライトします。この情報から最適化の手順を決定できます。ラベルが付いたドットや X マークが表示され、次のメモリーレベルで選択されたカーネルの演算強度とメモリーレベルを表わします。
メモリードットとそれぞれのルーフライン間の垂直距離は、特定のメモリー・サブシステムによって制限される度合いを示します。ドットがルーフラインに近い場合、カーネルはそのメモリーレベルの帯域幅で制限されていることを意味します。
メモリードットの水平距離は、カーネルがキャッシュをどのくらい効率良く使用しているかを示します。例えば、L3 と GTI のドットが 1 つのカーネルの水平軸上で隣接している場合、カーネルは同様に L3 と GTI を使用します。これは、L3 と GTI が効率良く利用されていないことを意味します。コード内のデータ再利用を改善して、アプリケーションのパフォーマンスを向上します。
x 軸の演算強度はドットが表示される順番を決定し、コードのパフォーマンスを視覚的に理解できます。例えば、CARM のドットは通常、L3 ドットの右側にあります。これは、読み取り/書き込みアクセスがキャッシュライン単位であり、CARM トラフィックは実際に操作されるバイト数の合計であるためです。最適化の可能性を特定するには、特定のカーネルの L3 キャッシュライン利用率メトリックを確認します。L3 キャッシュラインが十分に活用されていない場合、カーネルのメモリー・アクセス・パターンをチェックして、経過時間を短縮します。
理想的には、CARM ドットと L3 ドットが隣接して配置され、GTI ドットがそれらの右側にある必要があります。この場合、カーネルは適切なメモリー・アクセス・パターンを持っており、L3 キャッシュを活用しています。カーネルが L3 キャッシュラインをうまく活用できると次のことが当てはまります。
選択したカーネルが計算依存であるかメモリー依存であるかを判断するには、[GPU Details (GPU 詳細)] タブの [Roofline Guidance (ルーフラインのガイド)] セクションにあるデータを参照して、選択したカーネルのルーフライン・グラフを調べます。
矢印が対角線を指している場合、カーネルのほとんどはメモリー依存です。矢印が水平線を指している場合、カーネルのほとんどは計算依存です。インテル® Advisor は、実行される命令ミックスを基にカーネルのパフォーマンスを制限する計算ルーフを表示します。
このグラフは、コード内の主要な操作タイプ (FLOAT または INT) を示しており、カーネルで使用されるキャッシュ・メモリー・レベル、データタイプ、および命令ミックスのルーフのみを表わしています。カーネルに FLOP または INT 操作がない場合、そのカーネルはグラフ上に示されません。
例えば、以下に示すスクリーンショットのカーネルはメモリー依存です。カーネルはほかのメモリーレベルと比較して大量のデータ (6.88 GB) を転送するのにこのメモリーレベルを使用するため、パフォーマンスは L3 帯域幅によって制限されます。カーネル内のメモリー・アクセス・パターンを最適化することで、最大 5.1 倍のスピードアップを達成できます。
グローバルおよびローカルのワークサイズが異なる同一カーネルでの初期化は、計算タスクと呼ばれます。異なるグローバルおよびローカルのワークサイズで初期化されたカーネルは、計算タスクのパフォーマンスを確認または比較できます。
GPU アダプターと GPU スタック (タイル) に関する情報も調査できます。マルチタイルおよびマルチ GPU システムの場合、インテル® Advisor は、このパフォーマンス・データを GPU タイルごとに 1 つのテーブル行で表示します。各 GPU タイルのパフォーマンス・データを表示するには、対応する GPU の [GPU Adapter (GPU アダプター)] カラムと [GPU Stack (GPU スタック)] カラムを調べます。例えば、タスクが 2 つのタイルで実行されている場合、ターゲット GPU カーネルを含む行を見つけて展開し、これらのタイルに対応する 2 行のデータを調べます。
依存関係ビューには複数のタイルのデータも表示されます: GPU ルーフライン・グラフ、GPU ソース、GPU アセンブリー、命令ミックスを含む GPU の詳細。
グラフ上のドットを選択すると、グリッド内のそれぞれのカーネルがハイライト表示されます。
GPU ルーフラインの調査レポートの [GPU Details (GPU 詳細)] タブを使用して、各カーネルに関連する詳細情報を調べ、カーネルコードの最適化に関する推奨事項を取得します。