Coelacanth's Dream

一部の AMD GPU で実装、有効化されている RB+ とは何か

解説記事というよりはメモ、ノート的な記事。

まず、AMD GPU には RB (Render Backend) というユニットがあり、RB は MSAA や EQAA 等のアンチエイリアス処理、深度テストを行ない、各ピクセルが最終的にフレームに表示されるかの判定を処理し、結果をメモリに書き出す役割を持つ。
RB はクロックあたり 4ピクセルを処理することができ (4 pixel/cycle)、ROP で言えば 4基相当となる。
ROP は何の略 | Coelacanth’s Dream

そして、AMD GPU ドライバーのコードを読むに RB+ というものが存在し、一部のチップに実装、有効化されている。
RB+ の何が + なのかを調べたのがこの記事。

一部の APU/GPU に実装、有効化

RB+ / RB Plus は、オープンソースドライバーの src/amd/common/ac_gpu_info.c によると、Stoney APU (gfx810) と GFX9 とそれ以降世代の APU/GPU に実装されているが、すべてが有効にできるのではなく、一部のみとなっている。
有効可能なものには、APU だと StoneyRaven/Picasso (gfx902)Raven2 (gfx909)Renoir (gfx90c)VanGogh が、
dGPU では Vega12 (gfx904)RDNA 2 / GFX10.3 世代である Sienna CichlidNavy FlounderDimgrey Cavefish が該当する。

機能的には持っているはずだが、無効化されている GPU には、Vega10 (gfx900)Vega20 (gfx906)Navi10 (gfx1010)Navi12 (gfx1011)Navi14 (gfx1012) がある。
これらの GPU で無効化されている理由は不明。
APU では基本有効化されていることから、メモリ帯域が関係していると考えられる。
ただ GFX9 / Vega 世代以上の dGPU では、HBM2 2048-bit を備える Vega10 、HBM2 4096-bit の Vega20 では無効化され、HBM2 1024-bit である Vega12 では有効化され、
RDNA / GFX10 世代の Navi10 GDDR6 256-bit、Navi14 GDDR6 128-bit では無効化されているあたり、単純にメモリ帯域で決めているようにも思えない。

  info->has_rbplus = info->family == CHIP_STONEY || info->chip_class >= GFX9;

  /* Some chips have RB+ registers, but don't support RB+. Those must
   * always disable it.
   */
  info->rbplus_allowed =
     info->has_rbplus &&
     (info->family == CHIP_STONEY || info->family == CHIP_VEGA12 || info->family == CHIP_RAVEN ||
      info->family == CHIP_RAVEN2 || info->family == CHIP_RENOIR || info->chip_class >= GFX10_3);

RB+ の機能

RB+ がどういった機能を持つかは、結論からさっさと言えば、クロックあたりに処理可能な最大ピクセル数を 8ピクセルに拡張したものと思われる。

以下は GPUOpen Driver を構成する一つである PAL (Platform Abstraction Library) の一部コードだが、
クロックあたりに処理可能なピクセル数を、Shader Engine数 * SEあたりの RB数 * (RB+ が有効なら 8pixel、そうでないなら 4pixel) で求めている。

  // Pixels per clock follows the following calculation:
  // GPU__GC__NUM_SE * GPU__GC__NUM_RB_PER_SE * (RBPlus ? 8 : 4)
  pInfo->pixelsPerClock = (pInfo->gfx6.numShaderEngines * pInfo->gfx6.maxNumRbPerSe * (pInfo->gfx6.rbPlus ? 8 : 4));

また、Raven APU は RB を 2基 (8ROP相当) 持つが、AMD公式のスライドでは 16 Pixels Units となっている。1

ただ RB の規模を倍に拡張した訳ではないようで、RB+ が有効な場合、通常の倍の性能を得るため、入力するシェーダーのピクセルフォーマットを特定のものに指定する必要があるとされている。2

そして、調べるきっかけともなった 気になる点は、RDNA 2 / GFX10.3 世代の GPU、Radeon RX 6000シリーズ ではどうなっているかである。
Radeon RX 6000シリーズ は ROP数が AMD公式の製品ページに記載されており、RX 6900 XT は 128ROP となっている。3
この 128ROP という規模を、RB+ を 16基搭載することで実現しているのか、それとも RB を 32基搭載しているのか。
上述したように、RDNA 2 / GFX10.3 世代の APU/GPU は RB+ が実装、有効化されているため、前者の可能性が高いように思われる。
また、AMD が公開している Radeon RX 6000シリーズ のダイショット に近い CG を見るに、RB と思われるユニットは 16基確認でき、RB+ として相当する ROP数をカウントしていると考えれば辻褄が合う。
AMD Navi10のダイ観察 & 推測 | Coelacanth’s Dream AMD Radeon™ RX 6000 Series die shot

以前はオープンソースドライバー ( RadeonSI (OpenGL), RADV (Vulkan) ) にRB+ の機能を無効化するオプションが存在していたが、現在では削除されている。
そして、判定部に “RDNA 2 / GFX10.3 以上の世代” とあることから、これからの AMD GPU は RB+ がデフォルトとなるのではないかと思われる。