Coelacanth's Dream

DG2-G12, DG2 L3 banks, SIMD width

DG2/Alchemist (Xe-HPG)Ponte Vecchio (Xe-HPC) に関するメモ書き。

Index

DG2-G12

Linux Kernel に DG2-G12 バリアント (サブプラットフォーム) 関連のパッチが投稿された。
以前から IGC (intel-graphics-compiler)compute-runtime に取り込まれた変更から、DG2 には G10/G11 に加え、G12 バリアント (サブプラットフォーム) も存在することが示唆されていた。
3種類存在するかも知れない Intel Alchemist/DG2 と 2種類存在する Ponte Vecchio | Coelacanth’s Dream 今回のパッチで、ひとまず G12 バリアントの存在が確定したと言える。
パッチの内容は初期的なサポートを追加するもので、現時点で G12 はハードウェアに存在するバグへの回避策や機能面において、G10/G11 と共通していると推察される。

DG2 L3 banks

最近の Mesa3D へのパッチの中に、DG2 の L3キャッシュバンク数に関するものがあった。

補足すると、Intel はこれまで GPU が持つキャッシュについて、サンプラーごとに持つリードオンリーキャッシュを L2、GPU全体で共有するプログラマブルなキャッシュを L3 としていた。
それが Xe-Core、Vector Engine、Matrix Engine といった用語を打ち出すとともに、キャッシュ階層の呼称が整理され、従来の L3キャッシュを L2キャッシュとするようになった。Xe-Core が Sub-Slice、Vector Engine + Matirx Engine が EU に相当する。
しかし、ドライバ等のシェーダコンパイラ、GPU に最適化されたソフトウェアでは従来の用語を使い続けている。
Intel Architecture Day 2021 個人的まとめ ―― 用語が整理された Xe GPU | Coelacanth’s Dream

以下引用部によれば、DG2 では Sub-Slice (Xe-Core) の有効数が L3キャッシュバンク数と結びついている。
DG2 (Xe-HPG) では Sub-Slice あたり EU 16基 (SP 128基) を持ち、また最近 Intel(R) Media Driver に追加された記述から、L3キャッシュバンクあたりのキャッシュサイズは 512KB とされる。
Intel Alchemist/DG2 は AV1エンコードをサポートか | Coelacanth’s Dream 以上の情報を合わせると、Sub-Slice 17-32基 (EU 272-512基) は L3キャッシュバンク 32基 (16MB)、Sub-Slice 9-16基 (EU 144-256基) は L3キャッシュバンク 16基 (8MB)、Sub-Slice 8基以下 (EU 128基以下) は L3キャッシュバンク 8基 (4MB) を持つという構成が考えられる。

DG2
Sub-Slice
16< (<=32) 8< (<=16) <=8
EU 272-512 144-256 <=128
L3cache 32 Banks
(16MB?)
16 Banks
(8MB?)
8 Banks
(4MB?)
 +static void
 +update_l3_banks(struct intel_device_info *devinfo)
 +{
 +   if (devinfo->ver != 12 || devinfo->num_slices != 1)
 +      return;
 +
 +   if (devinfo->verx10 >= 125) {
 +      if (devinfo->subslice_total > 16) {
 +         assert(devinfo->subslice_total <= 32);
 +         devinfo->l3_banks = 32;
 +      } else if (devinfo->subslice_total > 8) {
 +         devinfo->l3_banks = 16;
 +      } else {
 +         devinfo->l3_banks = 8;
 +      }
 +   } else {

L3キャッシュバンク数の構成が 3種類あり、バリアント (サブプラットフォーム) 数と一致するが、ダイ自体のスペックが実際そのようになっているかはまだ不明。
上位ダイの一部 Sub-Slice と L3キャッシュバンクを無効化し、製品化するというパターンも考えられる。

SIMD width

Xe-LP では EU内に、8-wide FP32/Int32 ALU と 2-wide Extened Math (EM) ALU を持つことが Intel Architecture Day 2020 ですでに発表されている。
Intel Architecture Day 2020 個人的まとめ ―― XeHP は 1-Tile 512EU、XeLPアーキテクチャ詳細 | Coelacanth’s Dream Xe-HPGXe-HPC はまだ EU (Vector Engine) の詳細な構成は明かされていないが、SIMD幅 (要素数) については OSS のコードから読み取ることができる。

OneDNN、IGC に記述されている情報によると、Xe-HPG は 8-wide、Xe-HPC は 16-wide だとされている。

     int hw_simd() const {
         switch (hw) {
             case ngen::HW::Gen9:
             case ngen::HW::Gen10:
             case ngen::HW::Gen11:
             case ngen::HW::XeLP:
             case ngen::HW::XeHP:
             case ngen::HW::XeHPG: return 8;
             case ngen::HW::XeHPC: return 16;
             default: ir_error_not_expected();
         }
         return -1;
     }

これは Xe-HPC とそれ以外 (Xe-LP/HP/HPG) で異なる特性、方向性を示している。
Xe-HPC は 16-wide化とともに、倍精度 (FP64/Int64) にネイティブで対応しており (早期ステッピングでは部分的に非対応)、EU あたりの演算性能は倍以上になっている。GRF (General Register File) も、従来の 32 Bytes から 64 Bytes の増やされている。1
Xe-HP も倍精度演算にネイティブで対応しているが、SIMD幅は 8-wide に留めている。GRF も 32 Bytes のままだ。
しかし、Xe-Core、ドライバ中では従来通り Sub-Slice(s) と呼ぶユニットあたりの EU数では、Xe-HPC は 8基、Xe-LP/HP/HPG では 16基となっており、Sub-Slice あたりで見たときのスループットはそう変わらない。
また、Xe-LP/HP/HPG では、EU 2基をペアとし、スレッドコントロールを共通化する Fused EU (EU fusion とも) が実装されている。だが Xe-HPC は Fused EU が実装されておらず、EU が単体で扱われる。

オタクの戯言であるから、確かな考えではないだろうが、SIMD幅を広げることでスレッドあたりの性能を上げたのが Xe-HPC 、スレッドコントロールを共通化することで効率を上げたのが Xe-LP/HP/HPG と見られるのだろうか?

EU Xe-LP/HP/HPG Xe-HPC
SIMD ALU width 8-wide 16-wide
GRF size per entry 32 Bytes 64 Bytes
EU per Sub-Slice 16 EU 8 EU
Fused EU Y N

DPAS/DPASW

Xe-HP から行列演算のための命令として、DPAS/DPASW (Dot Product Accumulate Systolic /Wide) が用意されている。
Xe-HP/HPG では DPAS/DPASW をサポートするが、Xe-HPC は DPAS のみをサポートする。
これは DPASW が Fused EU を想定した命令であるため、その関係で Xe-HPC ではサポートされてない。

 bool supportDpaswInstruction() const
 {
     return hasFusedEU() && supportDpasInstruction();
 }

oneDNN 内のコメントから、DPASW では内部的に行列ブロックを 2つに分解し、それを Fused EU によってペアとなる EU 2基でそれぞれ実行するものと推察される。
スレッドコントロールを共通化した Fused EU において、行列演算の性能を向上させるための命令が DPASW だと言えるだろう。

     // C is arranged in 8x8 column major blocks organized in a 4x6 row major array (allowing a tile size of up to 32x48).
     // Each 8x8 block is split in two 8x4 blocks (due to dpasw).
     // Rearrange into contiguous columns and use hword x4 stores, taking 4 columns at a time.
     //   (effectively a 4x4 whole-register transpose)
     // This burns through icache -- consider rewriting with indirect accesses.

参考リンク