Coelacanth's Dream

Xe-LP/HP より大きな命令キャッシュを持つ Xe-HPG

Intel oneAPI の深層学習ライブラリ、oneAPI Deep Neural Network Library (oneDNN)Xe-HP/HPG をサポートするコミットが取り込まれた。
そこには Xe-HP/HPG のアーキテクチャの一部を示す記述が含まれている。
Xe-HPG については Intel Architecture Day 2021 で詳細が語られたが、まだ正式リリースがまだということもありそれは一部で、語られていない部分はまだまだある。Xe-HPG アーキテクチャ を採用する最初の GPU/SoC DG2/Alchemist は 2021Q1 でのリリースが予定されている。
Intel Architecture Day 2021 個人的まとめ ―― 用語が整理された Xe GPU | Coelacanth’s Dream

Xe-HPG-Core の L1命令キャッシュサイズ

Xe アーキテクチャ では複数の EU (Vector Engine, Matrix Engine) やロード/ストアユニットをまとめた Xe-Core ごとに L1命令キャッシュを持つ。
Xe-Core は、以前は Sub-Slice(s) と呼ばれており、Intel GPU 向けのオープンソースソフトウェア、ドライバーではそのまま Sub-Slice(s) を使っている。
Tiger/Rocket/Alder LakeDG1 が採用する Xe-LP アーキテクチャ では L1命令キャッシュのサイズは 48 KiB となっていた。
今回追加されたコードによれば、Xe-HP は同じ 48 KiB、そして Xe-HPG はその倍のサイズとなる 96 KiB を L1命令キャッシュに持つとしている。

L1命令キャッシュサイズは Sub-Slice あたりの EU数等に変化はあったものの、Gen9 アーキテクチャ から 48 KiB で通してきたためアーキテクチャの変更でも注目される点と言える。

 static size_t icache_size(ngen::HW arch) {
     switch (arch) {
         case gpu_gen9: return 48 * 1024;
         case gpu_xe_lp: return 48 * 1024;
         case gpu_xe_hp: return 48 * 1024;
         case gpu_xe_hpg: return 96 * 1024;
         default: return 0;
     }
 }

自分は GPUアーキテクトでも無いため確かなことは言えないが、Xe-HPG で L1命令キャッシュを倍にした意図を個人的に考えていく。

まず、上記コードの各アーキテクチャにおける L1命令キャッシュサイズは、実行するカーネルのサイズと比較し、カーネルが L1命令キャッシュより大きかった場合にメッセージを出力する部分に使われている。
その点で考えると深層学習、推論処理においてより巨大なカーネルを実行する際の性能改善のため、L1命令キャッシュサイズを倍増させたとも考えられるが、ゲーミング向けの Xe-HPG で増やし、コンピューティング向けである Xe-HP は 48 KiB で据え置きというのは少し違和感を覚える。一応 Xe-HP の表記キャッシュサイズは今後変更される可能性もあるが。
ただ開発時期や製造プロセスが影響している可能性もある。

L1命令キャッシュの倍増がグラフィクス、ゲーミング性能にどう影響を与えるかを考えれば、Intel は Architecture Day 2021 でアップスケーリング技術 Xe SS (Super Sampling) を発表しており、画質向上のため複雑な処理を行う上で有効だと思われる。
それ以外にも、多数のシェーダーを処理するゲームにおいても効果的なのかもしれない。

Xe-HPXe-HPG の共通点

以前、Xe-HP では EU (Vector Engine) あたりのスレッド数が 1つ増えて 8スレッドとなり、また 4スレッドと設定することでスレッドあたりのレジスタファイルを 256エントリに増やす Large GRFモード をサポートすることが intel/intel-graphics-compiler への新たなコミットで明かされた。
Intel Xe-HP EU に追加されるパイプラインと増加するスレッド/レジスタファイル | Coelacanth’s Dream 今回 Xe-HPG も Large GRFモードをサポートすることが明かされた。

     // Assume 7 threads by default
     int32_t threads_per_eu[2] = {7, 7};
     switch (gpu_arch_) {
         case gpu::compute::gpu_arch_t::gen9:
         case gpu::compute::gpu_arch_t::xe_lp:
             threads_per_eu[0] = 7;
             threads_per_eu[1] = 7;
             break;
         case gpu::compute::gpu_arch_t::xe_hp:
         case gpu::compute::gpu_arch_t::xe_hpg:
             threads_per_eu[0] = 8; // 128 regs/thread
             threads_per_eu[1] = 4; // 256 regs/thread
             break;

ここは Xe-HP/HPG で共通する部分となる。
だが Xe-HPG は 64-bit 精度のデータ型にはエミュレートで対応し1Xe-HP は FP64/Int64 を処理する専用パイプラインを持つとしている。
そのため EU部において一部共通するが、パイプライン構成についてはそれぞれのターゲットに向けて最適化された別物となる。

Xe GPU Xe-LP Xe-HPG Xe-HP Xe-HPC
Vector Engine 256-bit? 256-bit ? 512-bit
VE per SS (Sub-Slice) 16 16 ? 8
L1I$ per SS 48 KB 96 KB 48 KB ?
Matrix Engine N/A 1024-bit ? 4096-bit
Load/Store (SLM) 128B? ? ? 512B
L1D$/SLM per SS 128 KB ? ? 512 KB
Native FP64 N/A N/A Y Y

参考リンク