Coelacanth's Dream

Meteor Lake に向けた Intel Graphics Compiler へのさらなるパッチ

以前に Intel の Pete Chou 氏より、Intel Graphics Compiler (IGC) のサポートターゲット、vISA (virtual ISA) に Meteor Lake を追加するコミットが投稿された。
そして今回、Intel の Mateusz Borzyszkowski 氏により、Meteor Lake のサポートに向けたさらなるパッチが IGC に投稿されている。
Intel Graphics Compiler で Meteor Lake のサポートが進み始める ―― Xe-HPG、XMXユニットは非搭載か、再度 FP64 に対応 | Coelacanth’s Dream

Xe-HPG

前回触れたように、Meteor Lake GPU の IGC におけるアーキテクチャ、プラットフォームは Xe-HPG とされている。
Intel Graphics Compiler で Meteor Lake のサポートが進み始める ―― Xe-HPG、XMXユニットは非搭載か、再度 FP64 に対応 | Coelacanth’s Dream しかし、Alchemist/DG2 とまったく同じアーキテクチャ、構成という訳ではなく、Meteor Lake GPU では XMXユニットを用いて実行される DPAS (Dot Product Accumulate Systolic) 命令をサポートしないといった違いがある。
Meteor Lake GPU では FP64 (DP) のサポートが復活することから、EU の構成もある程度 Alchemist/DG2 とは異なると考えられる。

      IGFX_XE_HP_SDV = 1250,
      IGFX_DG2 = 1270, // aka - ACM/Alchemist
      IGFX_PVC = 1271,
 +    IGFX_METEORLAKE = 1272,

Meteor Lake GPU の HWレイトレーシングのサポートについては、IGC/AdaptorCommon/RayTracing/PrologueShaders.cpp に IGFX_METEORLAKE が追加されていることからサポートしていると考えられる。
それ以外の HWレイトレーシングのサポートを判定するコード部においても、変更がないことからも Meteor Lake GPU は Alchemist/DG2 と Ponte Vechhio 同様にサポートしていると考えられる。
またデータポートも Alchemist/DG2 と Ponte Vecchio 同様に LSC (Load Store Cache?) を採用している。

 bool supportRayTracing() const
 {
     return isProductChildOf(IGFX_DG2);
 }

倍精度と整数除算

IGC では整数の除算を XE_HP_SDV 世代からエミュレーションを用いるようにしており、FP64 (DP) をネイティブでサポートしている場合は FP64 で、サポートしていない場合は FP32 (SP) でエミュレートする。
XE_HP_SDV や Ponte Vecchio を除き、Intel Gen11 アーキテクチャ から FP64 (DP) のネイティブサポートは外されていたが、Meteor Lake GPU からは復活する。しかし、性能を理由に Meteor Lake でも整数除算は引き続き FP32 (SP) でエミュレートされる。

Meteor Lake GPU の FP64 (DP) 演算は Gen9 アーキテクチャ と同じ Extended Math (EM) Pipe で実行する方式だが、世代を経て EU 構成は変更されており、Gen11 までは SIMD-4 (Int/FP) + SIMD-4 (FP/EM) の構成だったが、Xe-LP では SIMD-8 (Int/FP) + SIMD-2 (EM) の構成となっている。
EM Pipe の比率が小さくなったため、FP32 (SP) 性能に対する FP64 (DP) 性能も低くなっていると考えられる。性能を理由として FP32 (SP) で整数除算をエミュレートするのは、そうした EU の構成変更が関わっているのだろう。

 // Has 64bit support but use 32bit for perf reasons
 bool preferFP32Emu() const {
     return m_platformInfo.eProductFamily == IGFX_METEORLAKE;
 }
     if (ctx.platform.preferFP32Emu() && IGC_IS_FLAG_DISABLED(Force32BitIntDivRemEmu)) {
         // Prefer using FP32 emulation even though DP support is available
         theEmuKind |= EmuKind::EMU_I32DIVREM_SP;
     }
     else if (ctx.platform.Enable32BitIntDivRemEmu())
     {
         if (!ctx.platform.hasNoFP64Inst())
         {
             // Use DP (and float) opeations to emulate int32 div/rem
             theEmuKind |= EmuKind::EMU_I32DIVREM;
         }
         else
         {
             // Use SP floating operations to emulate int32 div/rem
             theEmuKind |= EmuKind::EMU_I32DIVREM_SP;
         }
     }