Coelacanth's Dream

AMDVLK GPUOpenドライバーが Navi21/Sienna Cichlid に対応

AMD が公式に提供しているオープンソースな Vulkan ドライバー AMDVLK、それを構成する LLPC (LLVM-Based Pipeline Compiler)PAL (Platform Abstraction Library)XGL (Vulkan API Layer) が、Radeon RX 6800シリーズ のベースとなる Navi21/Sienna Cichlid に対応した。

Navi21/Sienna Cichlid の構成

AMDGPU ASIC の構成情報等が記述されている pal/ndDevice.cppNavi21/Sienna Cichlid の情報が追加された。

   else if (AMDGPU_IS_NAVI21(m_nullIdLookup.familyId, m_nullIdLookup.eRevId))
   {
       pChipInfo->supportSpiPrefPriority  =     1;
       pChipInfo->doubleOffchipLdsBuffers =     1;
       pChipInfo->gbAddrConfig            = 0x345; // GB_ADDR_CONFIG_DEFAULT;
       pChipInfo->numShaderEngines        =     4; // GPU__GC__NUM_SE;
       pChipInfo->numShaderArrays         =     2; // GPU__GC__NUM_SA_PER_SE
       pChipInfo->maxNumRbPerSe           =     4; // GPU__GC__NUM_RB_PER_SE;
       pChipInfo->nativeWavefrontSize     =    32; // GPU__GC__SQ_WAVE_SIZE;
       pChipInfo->minWavefrontSize        =    32;
       pChipInfo->maxWavefrontSize        =    64;
       pChipInfo->numPhysicalVgprsPerSimd =  1024; // GPU__GC__NUM_GPRS;
       pChipInfo->maxNumCuPerSh           =    10; // GPU__GC__NUM_WGP_PER_SA * 2;
       pChipInfo->numTccBlocks            =    20; // GPU__GC__NUM_GL2C;
       pChipInfo->gsVgtTableDepth         =    32; // GPU__VGT__GS_TABLE_DEPTH;
       pChipInfo->gsPrimBufferDepth       =  1792; // GPU__GC__GSPRIM_BUFF_DEPTH;
       pChipInfo->maxGsWavesPerVgt        =    32; // GPU__GC__NUM_MAX_GS_THDS;
   }
       else if (AMDGPU_IS_NAVI21(pInfo->familyId, pInfo->eRevId))
       {
           pInfo->gpuType                       = GpuType::Discrete;
           pInfo->revision                      = AsicRevision::Navi21;
           pInfo->gfxStepping                   = Abi::GfxIpSteppingNavi21;
           pInfo->gfx9.numShaderEngines         = 4;
           pInfo->gfx9.rbPlus                   = 1;
           pInfo->gfx9.numSdpInterfaces         = 16;
           pInfo->gfx9.maxNumCuPerSh            = 10;
           pInfo->gfx9.maxNumRbPerSe            = 4;
           pInfo->gfx9.numWavesPerSimd          = 16;
           pInfo->gfx9.supportFp16Dot2          = 1;
           pInfo->gfx9.gfx10.numWgpAboveSpi     = 5; // GPU__GC__NUM_WGP0_PER_SA
           pInfo->gfx9.gfx10.numWgpBelowSpi     = 0; // GPU__GC__NUM_WGP1_PER_SA
       }

ShaderEngine (SE) 4基、SE あたりの ShaderArray (SA) 2基、SA あたりの CU 10基、
SE あたりの RB (Render Backend) 数は 4基となり、RB+ に対応しているため、相当 ROP数は 128基となる。 ( 4 [SE] * 4 [RB] * 8 [pixel] )
Waveあたりのスレッド数はネイティブで Wave32 (32スレッド)、Wave64 (64スレッド) にも対応する。資料がまだ AMD より公開されていないため不明だが、Wave64 の場合は RDNA / GFX10 世代同様 Wave32x2 に分解して実行するのではないかと思う。
SIMDユニットあたりで保持される Wave数は 16エントリとなり、これは事前に出てきていた情報と一致する。
AMD Sienna Cichlid をサポートするパッチが OpenGL、Vulkanドライバーに投稿される | Coelacanth’s Dream

ただ不自然なのは TCC/L2キャッシュブロック (numTccBlocks) が 20基とされている点で、Navi21/Sienna Cichlid は GDDR6 256-bit (16ch) であるから 16基な十分なはずだ。
誤字、間違いである可能性もあるため、やはり AMD による資料公開が待たれる。

また、MALL (Memory Access at Last Level) の対応も追加されている。
マーケティング上では Infinity Cache と呼ばれるそれは、コード中においては MALL となるようだ。

RadeonSI (OpenGL) ドライバーでは既に NGGカリング/プリミティブシェーダー を、RDNA 2 / GFX10.3 世代の dGPU ではデフォルトに有効とするようになっているが、AMDVLK (Vulkan) ドライバーでも同様となる。1
RadeonSIドライバー + RDNA 2 では NGGカリング/プリミティブシェーダー がデフォルトで有効に | Coelacanth’s Dream