Coelacanth's Dream

RADV + RDNA 2 で NGGカリングがデフォルトで有効に

以前、RADV では RDNA 2/GFX10.3 世代で NGGカリング/プリミティブカリング をデフォルトで有効化するつもりがあることに触れたが、Phoronix の Michael Larabel 氏による検証で安定したパフォーマンス向上が確認できたとし、Timur Kristóf 氏によってそれを適用するパッチ/マージリクエストが投稿されている。
RadeonSI ドライバーから非同期コンピュートによるプリミティブカリング機能が削除 | Coelacanth’s Dream

NGG/NGGカリング

NGG/プリミティブシェーダーNavi14 を除く RDNA/GFX10 世代の GPU でデフォルトで有効化されているが、NGGカリング は条件が増え、RDNA 2/GFX10.3 とそれ以降の世代の GPU、かつ RenderBackend (RB) を 2基以上持つ GPU がデフォルトで有効化の対象になる。
RDNA/GFX10 世代は NGGカリング がデフォルトで有効化されないが、環境変数 RADV_PERFTEST=nggc をセットすることで有効化できる。

 +   device->use_ngg_culling =
 +      device->use_ngg &&
 +      device->rad_info.max_render_backends > 1 &&
 +      (device->rad_info.chip_class >= GFX10_3 ||
 +       (device->instance->perftest_flags & RADV_PERFTEST_NGGC)) &&
 +      !(device->instance->debug_flags & RADV_DEBUG_NO_NGGC);
 +

判定部からして RB が 1基の場合は有効化が不可能となっているが、この点は以前から変わらない。
現時点ではまだ対象となる RB 1基の RDNA 2/GFX10.3 APU/GPU は登場していないが、小規模な Zen 2 + RDNA 2 APU VanGogh が該当する可能性はある。1

シェーダーベースのカリング処理は、効率が Pixel Shader (PS) のスループットに依存するとされており、RADV では GPU の規模、構成から PS への最大入力パラメーター数を決定している。2
RB 1基の場合、NGGカリング を有効化できないようにされているのも、効率が低く、かえって性能に悪影響が与える可能性があるからなのかもしれない。

 -   if (max_render_backends < 2)
 -      return false; /* Don't use NGG culling on 1 RB chips. */
 -   else if (max_render_backends / max_se == 4)
 +   if (max_render_backends / max_se == 4)
        max_ps_params = 6; /* Sienna Cichlid and other GFX10.3 dGPUs. */
     else
        max_ps_params = 4; /* Navi 1x. */

Parameter Cache (PC)

NGG は、Pixel Shader への入力用オンチップバッファ、パラメーターキャッシュ (Parameter Cache, PC) を搭載している。
コードから、パラメーターキャッシュの規模は RDNA 2 dGPU (Sienna Cichlid/Navi21, Navy Flounder/Navi22, Dimgrey Cavefish/Navi23)RDNA 1 dGPU (Navi10/Navi12) で同じものとなっている。
それでいて上記 max_ps_paramsRDNA 2 dGPU の方が大きく設定されているため、RDNA 1 -> RDNA 2NGG 部が改良されていると考えられる。

    if (info->chip_class >= GFX9 && info->has_graphics) {
       unsigned pc_lines = 0;
	
       switch (info->family) {
       case CHIP_VEGA10:
       case CHIP_VEGA12:
       case CHIP_VEGA20:
          pc_lines = 2048;
          break;
       case CHIP_RAVEN:
       case CHIP_RAVEN2:
       case CHIP_RENOIR:
       case CHIP_NAVI10:
       case CHIP_NAVI12:
       case CHIP_SIENNA_CICHLID:
       case CHIP_NAVY_FLOUNDER:
       case CHIP_DIMGREY_CAVEFISH:
          pc_lines = 1024;
          break;
       case CHIP_NAVI14:
       case CHIP_BEIGE_GOBY:
          pc_lines = 512;
          break;
       case CHIP_VANGOGH:
       case CHIP_YELLOW_CARP:
          pc_lines = 256;
          break;
       default:
          assert(0);
       }

RadeonSI (OpenGL) ドライバーにも NGGカリング は実装されており、デフォルト有効化の条件は RADV と概ね同じだが、ワークステーション用途を想定してか、マーケティングネームに Pro が入っているかが条件に追加されている (is_pro_graphics)。

    sscreen->use_ngg = !(sscreen->debug_flags & DBG(NO_NGG)) &&
                       sscreen->info.chip_class >= GFX10 &&
                       (sscreen->info.family != CHIP_NAVI14 ||
                        sscreen->info.is_pro_graphics);
    sscreen->use_ngg_culling = sscreen->use_ngg &&
                               sscreen->info.max_render_backends >= 2 &&
                               !((sscreen->debug_flags & DBG(NO_NGG_CULLING)) ||
                                 LLVM_VERSION_MAJOR <= 11 /* hangs on 11, see #4874 */);

RadeonSI では、Navi14 を除く RDNA/GFX10 とそれ以降の世代かつ、Pro カードで NGG がデフォルトで有効化され、NGGカリング はそれに加え RB が 2基以上の場合にデフォルトで有効化される。