以前に 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; } }