Coelacanth's Dream

3種類存在するかも知れない Intel Alchemist/DG2 と 2種類存在する Ponte Vecchio

オープンソースで開発され、Github上 (Intel Corporation) で公開されている Intel GPU 各種ライブラリ/ドライバにて、Alchemist/DG2 (Xe-HPG)Ponte Vecchio (Xe-HPC) への対応が進められている。
その中に Alchemist/DG2Ponte Vecchio に複数のバリアントが存在することが示唆する記述が確認された。

余談だが、どうやら AlchemistACM と略されるらしい。

Index

DG2-G10/G11/G12

DG2 は元々、Linux Kernel における Intel GFXドライバー (i915) へのパッチにて DG2-G10/G11 という 2種類のバリアントが存在することが明らかにされていた。
Linux Kernel に Intel Xe-HP SDV, DG2 をサポートする最初のパッチが投稿される | Coelacanth’s Dream Intel Architecture Day 2021 で公開された DG2 のダイCGもまた 2種類あり、規模は不明だが DG2-G10/G11 がそれに対応するものと考えられていた。

それが、最近 IGC (intel-graphics-compiler)compute-runtime に取り込まれた変更から、DG2-G12 というバリアントも存在することが示唆されている。

     DG1 = 0x0c0000,
     RPL_S = 0x0c0000,
     ADL_P = 0x0c0000,
     ADL_S = 0x0c0000,
     RKL = 0x0c0000,
     TGL = 0x0c0000,
     XEHP_SDV = 0x0c0100,
     DG2_G10_A0 = 0x0c0200,
     DG2_G11 = 0x0c0201,
     DG2_G10_B0 = 0x0c0201,
     DG2_G12 = 0x0c0202,
     PVC_XL_A0 = 0x0c0300,
     PVC_XL_B0 = 0x0c0301,
     PVC_XT_A0 = 0x0c0400,
     PVC_XT_B0 = 0x0c0401,
     CONFIG_MAX_PLATFORM,
 } PRODUCT_CONFIG;

PRODUCT_CONFIG での値は Target device を示し、<Major>.<Minor>.<Revision> のフォーマットになっている。AMDGPU における GPU/Target ID も同様のフォーマットを用いている。
Intel GPU では、GPU/Media/Display IP バージョンを <Gen>.<Release> のフォーマットで示し、先の <Major><Gen> は基本同じ値、世代が入るため混同しやすいが、それぞれ意味は異なる。

そして上記引用部では、DG2-G10 A012.2.0DG2-G10 B0/G1112.2.1DG2-G1212.2.2 とされている。
Revison が異なることから、ハードウェアに存在するバグとソフトウェア側でのその回避策 (Workaround) が異なると思われるが、それ以上のことは不明。
Intel GFXドライバーにも、DG2-G12 のサポートはまだ追加されていない。
DG2 全体の規模については現在、最小で EU 128基、最大で 512基であることが各種ライブラリ、ドライバーのコメント部などで語られている。
今回の変更で新たに現れた DG2-G12 がその範囲内に存在するか、それともさらに小さい、あるいは大きなバリアントとなるか。

DG2 DeviceID

Mesa3D、IGC、gmmlib に DG2 の DeviceID (PCI ID) が追加されているが、中でも gmmlib は DG2-G10/G11 がそれぞれどの DeviceID が割り当てられているか、詳細を明らかにしている。

 // Macro to identify DG2 device IDs
 #define GFX_IS_DG2_G11_CONFIG(d) ( ( d == DEV_ID_56A5 )               ||   \
                                  ( d == DEV_ID_56A6 )             ||   \
                                  ( d == DEV_ID_5693 )             ||   \
                                  ( d == DEV_ID_5694 )             ||   \
                                  ( d == DEV_ID_56B0 )             ||   \
                                  ( d == DEV_ID_56B1 )             ||   \
                                  ( d == DEV_ID_4F87 )             ||   \
                                  ( d == DEV_ID_4F88 ))
	
 #define GFX_IS_DG2_G10_CONFIG(d) ( ( d == DEV_ID_56A0 )                              ||   \
                                       ( d == DEV_ID_56A1 )                              ||   \
                                       ( d == DEV_ID_56A2 )                              ||   \
                                       ( d == DEV_ID_5690 )                              ||   \
                                       ( d == DEV_ID_5691 )                              ||   \
                                       ( d == DEV_ID_5692 )                              ||   \
                                       ( d == DEV_ID_4F80 )                              ||   \
                                       ( d == DEV_ID_4F81 )                              ||   \
                                       ( d == DEV_ID_4F82 )                              ||   \
                                       ( d == DEV_ID_4F83 )                              ||   \
                                       ( d == DEV_ID_4F84 ))

DG2-G10 には 11個、DG2-G11 には 8個の DeviceID が割り当てられている。
ただ IGC には gmmlib と異なり、DG2 全体で 33個の DeviceID、そして DG2-G11 には上記引用部に 0x56C1 を加えた計 9個の DeviceID が割り当てられているとする。1
また一方で、Mesa3D には現在 13個の DeviceID が追加されている。おそらく IGC, gmmlib は開発用カードの DeviceId も含まれており、実際にリリースされる SKU数には Mesa3D の DeviceID数のが近いと思われる。

 +
 +CHIPSET(0x5690, dg2, "DG2", "Intel(R) Graphics")
 +CHIPSET(0x5691, dg2, "DG2", "Intel(R) Graphics")
 +CHIPSET(0x5692, dg2, "DG2", "Intel(R) Graphics")
 +CHIPSET(0x5693, dg2, "DG2", "Intel(R) Graphics")
 +CHIPSET(0x5694, dg2, "DG2", "Intel(R) Graphics")
 +CHIPSET(0x5695, dg2, "DG2", "Intel(R) Graphics")
 +CHIPSET(0x56a0, dg2, "DG2", "Intel(R) Graphics")
 +CHIPSET(0x56a1, dg2, "DG2", "Intel(R) Graphics")
 +CHIPSET(0x56a2, dg2, "DG2", "Intel(R) Graphics")
 +CHIPSET(0x56a5, dg2, "DG2", "Intel(R) Graphics")
 +CHIPSET(0x56a6, dg2, "DG2", "Intel(R) Graphics")
 +CHIPSET(0x56b0, dg2, "DG2", "Intel(R) Graphics")
 +CHIPSET(0x56b1, dg2, "DG2", "Intel(R) Graphics")

PVC-XL/XT・Xe-HPC-XL/XT

Alchemist/DG2 だけでなく Ponte Vechhio (Xe-HPC) にも XL/XT バリアントが存在する。
このことは少し前に IGC へ取り込まれた変更から確認されていたが、上 DG2 の部で引用した PRODUCT_CONFIG から、異なる Target device ID が割り当てられていることが新たに分かった。
PVC_XL12.3.xPVC_XT12.4.x が割り当てられている。
Xe-HPC のサポートが intel-graphics-compiler、oneDNN に追加される | Coelacanth’s Dream

XL/XT の違いとしては機能的な面が挙げられる。
コード中のコメントによれば、PVC XL A0 では倍精度演算や LSC (Load Store Cache) の一部機能に対応しておらず、PVC XT B0 からの対応としている。
LSC は従来から大幅に設計が見直されたデータポートであり、Alchemist/DG2 にも実装されている。2なお、Xe-HP では実装されていない。設計時期の関係だろうか。

 bool hasHalfSIMDLSC() const
 {
     return (m_platformInfo.eProductFamily == IGFX_DG2 && SI_WA_FROM(m_platformInfo.usRevId, ACM_G10_GT_REV_ID_B0)) ||
         GFX_IS_DG2_G11_CONFIG(m_platformInfo.usDeviceID) ||
         // false for PVC XL A0 RevID==0x0, true from PVC XT A0 RevID==0x3==REVISION_B
         (m_platformInfo.eProductFamily == IGFX_PVC && m_platformInfo.usRevId >= REVISION_B);
 }
  bool hasPartialInt64Support() const
 {
     // false for PVC XL A0 RevID==0x0, true from PVC XT A0 RevID==0x3==REVISION_B
     return (m_platformInfo.eProductFamily == IGFX_PVC && m_platformInfo.usRevId >= REVISION_B) ||
         IGC_IS_FLAG_ENABLED(ForcePartialInt64);
 }

PVC/Xe-HPC の倍精度演算対応については、oneAPI の深層学習ライブラリ oneDNN でも触れられている。
PVC XT B0 以前のステッピングでは倍精度演算にネイティブで対応しておらず、エミュレートでの対応となる。
だが以下の記述からは PVC XT B0 でもまだ完全には対応していないように受け取れる。
PVC XT B0 は ADD (加算) や同じ精度を保持した MUL (乗算) には対応しているが、倍の精度で結果を出力する MUL (DWxDW -> QW)、QW (64-bit) での AND/OR/XOR 操作には対応していないとされている。

     EmulationStrategy(ngen::HW hw_, int stepping = 0) {
         using namespace ngen;
         if (hw_ == HW::Gen11) emulate64 = true;
         if (hw_ >= HW::Gen11) emulateDWxDW = true;
         if (hw_ == HW::Gen12LP) emulate64 = true;
         if (hw_ == HW::XeHPG) emulate64 = true;
         if (hw_ == HW::XeHPC) {
             if (stepping >= SteppingPVCXTB0)
                 emulate64_mul = emulate64_logic = true;
             else
                 emulate64 = noemulate64_shift = true;
         }

Intel Architecture Day 2021、HotChips33 で Ponte Vecchio A0 の現在ステータスが示された際、倍精度ではなく単精度 (FP32) でのスループットが出されていたが、早期リビジョンでは倍精度に対応していなかったことが関係していたのだろう。3

また、倍精度 (FP64/Int64) への対応は別の部分でも管理されているが、そこに Xe-HP の記述が無いことから、Xe-HP では既に対応が行われていると考えられる。
上記 oneDNN からの引用部分にも Xe-HP の記述はない。
Xe-HP では実装されている倍精度演算が、Ponte Vecchio では難航していることが窺える。機能的に Compute Tile部の設計で詰まっているのだろうか。
Compute Tile は TSMC N5 と Intel Next Gen の 2つのプロセスで製造され、まずは TSMC N5版が先行する。

以前は BaseTile 1基構成が XL、これまでに何度も公開されている BaseTile 2基構成が XT となるのではないかと書いたが、ステッピングと対応機能から、XL は開発途中のシリコンに当てられたバリアントなのかもしれない。

PVC XL/XT の DeviceID 情報も追加されており、PVC XL には 0x0BD0 のみが、PVC XT には 0x0BD5..0x0BD8, 0x0BE1、そして PVC XT の一時的な DeviceID に 0x0BE5 が割り当てられている。

     static constexpr uint32_t pvcXlDeviceId = 0x0BD0;
     static constexpr uint32_t pvcXtDeviceIds[5] = {0x0BD5, 0x0BD6, 0x0BD7, 0x0BD8, 0x0BE1};
     static constexpr uint32_t pvcXtTemporaryDeviceId = 0x0BE5;

参考リンク