Coelacanth's Dream

RadeonSIドライバーから DFSM 機能のサポートが削除

オープンソースで開発される AMD GPU の OpenGLドライバー RadeonSI に向けて、AMD の GPUドライバー開発者である Marek Olšák 氏より DFSM 機能のサポートを削除するパッチが投稿された。
パッチのマージリクエストは、元は Navi1x/GFX10.1 世代の GPU に存在するハードウェアのバグに対する回避策や、 NGG (Next Generation Geometry) カリング機能の最適化等、細やかな修正、最適化を目的としたもので、DFSM 機能を削除する部分は後から追加されている。

DFSM

DFSM 機能は Vega/GFX9 世代の AMD GPU からハードウェアに搭載された機能であり、その世代における改良の目玉とされた DSBR (Draw Stream Binning Rasterizer) を全体的に適用するのが DFSM とされる。1
DSBR ではレンダリング領域を細かいタイルに分割し、頻繁に使われる部分を L2キャッシュに置くことで性能向上とメモリアクセスを減らすことで電力効率の向上を狙った機能。
Vega/GFX9 発表時の資料では、有効時で最大 10%のフレームレート向上と 33% の使用メモリ帯域削減が確認できたとしている。2
Vegaの新機能今いずこ | Coelacanth’s Dream

DFSM が何の略かは正直不明で、1年と半年前の自分は DFSM (Deterministic Finite State Machine) の略だとしていたが、AMD の公式資料あるいは AMD のソフトウェアエンジニア方がそう呼ぶところは見付からなかった。唯一 PhoronixMichael Larabel 氏が記事内でそう書いており、恐らく過去の自分はそれを元にしたと思われるが、記事内にあるリンクからその略称とする根拠になるようなものは無い。3
その記事のコメントに 「Deterministic Finite State Machine の意じゃないか」というものがあり、Michael Larabel 氏はそれをそのまま追記した可能性がある。
要は DFSM が何の略かは本当に不明で、 Phoronix や自分は一度二度 Deterministic Finite State Machine の略と説明したがそれは不確かな情報ということだ。

DSBR の部分的な適用が DPBB とされるが、こっちは Raven Ridge APU の資料で言及され、特許資料もあり、 Deferred Primitive Batch Binning の略であることが確認できる。4

DFSM の効果

ドライバーからサポートが削除されることになった DFSM の性能への効果は実際どうだったかと言うと、まあ微妙だった。
Vulkanドライバー RADV においては、Raven APU だといくつかのグラフィクスデモとゲームで 2-3% の性能向上が確認できたことからデフォルトで有効化――された後に一部のゲームでは逆に 3% 性能低下したためデフォルトでは無効状態に戻されている。
RADV 開発者の一人である Bas Nieuwenhuizen 氏が検証した限りではベンチマーク (dual_quad_bench) で最大フィルレートが 16 pixels/cycles から 32 pixel/cycles に倍の性能向上があったとコメントしている。5 シンプルなベンチマークでは DFSM の効果が最大限発揮されるが、ゲームといった現実的なアプリケーションではそう単純には行かなかったということだろう。

DFSM 自体は Vega/GFX9 の次世代、Navi1x/RDNA/GFX10.1 でも引き継がれたが、有益な効果は得られないとコード中のコメントに記述され、さらにその次世代 Navi2x/RDNA 2/GFX10.3 ではサポートがとうとう削除された。
それでも Vega/GFX9 世代の GPU を搭載する APU は今も多くが出回っており (Raven2/Renoir/Cezanne)、DFSM は今までドライバーでのサポートが残され、APU の場合はデフォルトで有効にする処置が取られていたが、Raven2 APU だとプリミティブ描画のレートを最大 43%も低下することが判明し、今回サポートが削除されることになった。

       /* DFSM is not supported on GFX 10.3 and not beneficial on Navi1x. */
    } else if (sscreen->info.chip_class == GFX9) {
       sscreen->dpbb_allowed = !sscreen->info.has_dedicated_vram;
       /* DFSM reduces the Raven2 draw prim rate by ~43%. Disable it. */
       sscreen->dfsm_allowed = false;
     }

Raven2 APU の GPU L2キャッシュは小さく、Raven/Picasso/Renoir/Cezanne APU が 1MiB 持つ中、その 1/8 の 128KiB しか持たない。
Raven2 の GPU L2キャッシュは 128KB | Coelacanth’s Dream DFSM に使用メモリ帯域を削減する効果があり、それはメモリ帯域がディスクリートGPUより狭い APU では性能への良い影響を与える可能性があったが、L2キャッシュを多く活用するため、L2キャッシュが小さい Raven2 APU では逆に働いてしまったのではないかと考えられる。

DSBR を部分的に適用する DPBB (Deferred Primitive Batch Binning) は対照的に優秀とも言え、性能向上はおとなしいが低下されることはなく、Vega/GFX9 世代の以降の GPU では APU、dGPU 問わずデフォルトで有効化され、Navi2x/RDNA 2/GFX10.3 世代でもハードウェアに機能が搭載されている。
ただ、ソースコードを追うと RenderBackend が 4基 (ROP 16基相当、RB+ は 32基相当6) 搭載されている GPU のような場合では (他の条件もあるが) 非効率なためか無効化されるようだ。
GPU の規模が小さく、メモリ帯域も狭い APU 向けという所は DPBB も同じだと言える。

    /* Disable DPBB when it's believed to be inefficient. */
    if (sscreen->info.max_render_backends > 4 && ps_can_kill && db_can_reject_z_trivially &&
        sctx->framebuffer.state.zsbuf && dsa->db_can_write) {
       si_emit_dpbb_disable(sctx);
       return;
    }

ほとんどの機能は性能向上、電力効率の向上を目的に開発、実装されるが、その全てがうまく働いてくれる訳ではないという現実を DFSM は見せてくれたのかもしれない。
実装されても一切サポートされなかった機能がある可能性を思えば、DFSM は一時期でも注目、活用されたことはまだ幸いだったとも考える。