Coelacanth's Dream

Vegaの新機能今いずこ

色々と新機能をアピールしながら登場したVegaだったが、その新機能はどうなったのか?
という個人的なまとめ。

HBCC(High Bandwidth Cache Controller)

広帯域なHBM2をキャッシュに使い、CPU側のDRAMもVRAMとして効率的に扱う機能。
スライドでは、HBCCからDRAM以外にNV(Non-volatile) RAMやNetwork Storageにも繋げられるようだったが、一般ではDRAMまでで、Radeon Pro SSGでは2TBのSSDがオンボードに搭載された。

Vega10/12/20では有効に出来るはずだが、それ以降のArcturus、Naviでは削除されたと思われる。

まずHBCCのOFF/ONでGFX IDが異なり、Vega10ではOFFがgfx900、ONがgfx901となっているのだが、1
そのgfx901でLLVMのレポジトリを検索したところ、無慈悲な言葉が。
AMDGPU: Remove remnants of gfx901 (it was deprecated some time ago) - llvm/llvm-project

Ravenが gfx902 、Vega12が gfx904 、Vega20が gfx906 であり、HBCC ONのGFX IDがそれに1足した gxf903/gfx905/gfx907 となる。
そして、Arcturusが gfx908 、Raven2/Renoirが gfx909 となっており、HBCC ON分の空きが存在しない。
これはNaviも同様で、Navi10が gfx1010 、Navi12が gfx1011 、Navi14が gfx1012 と詰められている。
GDDR6を搭載するNaviはまだしも、HBM2を使うであろうArcturusでもないのだから、復活は望み薄だ。

そもそも gfx905、gfx907 が追加された痕跡がLLVMのリポジトリにないことから、割と早い段階でそれ以上の改良を諦めたのではと勘ぐってしまう。

中身としては、APU向けのレジスタ割り付け機能である xnack を dGPUでも有効にしたというものであり、2そういう意味では CPU と dGPU をまとめあげる機能と言えるかもしれない。
AMD は CPU と GPU のメモリ空間統合を進めており、HBCCはそれに近いように思えるが、メモリ空間、ページテーブルを共有する訳ではなく、それ程進んだ機能ではないはずだ。

ゲーム向けの機能としては、使用可能なVRAMを倍以上まで増やしつつ効果的に使えるということで、VRや最新のゲームを高プリセットでやりたいゲーマーから一定の支持はあった、はず。
Vegaが発売初期はマイニング需要で狩られてゲーマーが買えない状況が続いたり、後継のRadeonVIIが16GBとGPUとしては破格の容量を持っていたため、影は薄くなってしまった。

コンピュート機能としても、HPC用途においてGPUの比率が高まっていたことから、GPU側でSSD等を扱える機能は、方向が間違っていないはずだったが…… 4GPUs System

DSBR(Draw Stream Binning Rasterizer)

Vega10における改良の目玉であり、レンダリング領域を細かいタイルに分割し、頻繁に使われる部分をL2キャッシュに置くことで効率化するという機能。
HBM2が広帯域といっても、オンチップなL2キャッシュには速度も電力効率もかなわないため、(Vega64だとメモリ帯域:483.8 GB/s、L2キャッシュ帯域:1.58 TB/s)
性能向上はもちろん、省電力効果も見込める。
ゲームによっては、有効時で最大10%のフレームレート向上と33%のメモリ帯域削減が見られたらしい。3

ソフトウェア側では DPBB、DFSM に分けて実装された。4
DPBBが部分的な、DFSMは全体的なものとなるらしいが、決まって速くなる訳ではないため、有効可能ではあるがデフォルトでは無効にされている。

そしてしばらくしてから、Vega10、Ravenの、指定範囲外の描画を切る scissor 機能にバグが見つかった。
radeonsi/gfx9: add a scissor bug workaround - Mesa GitLab radeonsi/gfx9: limit the scissor bug workaround to Vega10 and Raven only - Mesa GitLab

よく使われる部分を判別しておこなうDSBR機能はこのバグの影響を受け、限定的な実装となってしまった。5
このバグは Vega12/20、Raven2では修正されている。

Raven(APU)向けのチューニングがされていることから、メモリ帯域が狭いAPUでは効果があったが、dGPUではそうでもなかったのかもしれない。
(じゃあ上述したフレームレート最大10%UP、メモリ帯域33%削減は何なんだとなるが、10fpsが11fpsになっても10%の向上だ。下衆の勘繰りであることは否めないが。バグの影響もあったかもしれない)

それでもGFX10に引き継がれ、改良は進められているらしい。DPBBのみだが、GFX10ではデフォルトで有効にされる。
radeonsi/gfx10: implement primitive binning - Mesa GitLab

オープンソースドライバーのRadeonSI、RADVでは確認できるが、Windowsのプロプライエタリなドライバーではどうなのかはわからない。

DPBB(Deferred Primitive Batch Binning)

Raven向けの機能となる。6
Ravenではバグがあったが、Raven2、Renoirでは修正されていることから、有効時にそれらで性能や電力効率に差が出ると考えているが、検証した人はいないし、自分も実物を持ってないため不明。
また、差が出てもそこまで気にするような程ではないかもしれない。

DFSM(Deterministic Finite State Machine)

RADVで2-3%向上するからRavenではデフォルトで有効、と思いきや3%下がるゲームがあったので撤回、とそううまくは行かないようだ。
radv: Enable binning and dfsm by default on Raven. - Mesa GitLab
radv: Disable dfsm by default even on Raven. - Mesa GitLab

Rapid Packed Math

INT16/FP16演算において、32レーンのVectorALUでFP16x2とまとめて処理することでスループットを2倍にする機能。
INT8にも対応しているが、そちらはQSAD/MQSAD命令(動き検出等に使われる)のみ。
FP16、FP32の混合演算にも対応。

これはVegaの新機能というよりNCUの機能なため、Vega以降も引き継がれている。
Vega20ではINT4のPacked、INT4/8、FP16/32/64の混合演算にも対応した。

それとNaviでは呼び方がNCUではなくCUと戻った。
もう Next-Generation ではないから?

NGG(Next Generation Geometry) / Primitive Shader

解説に関しては、こちらの4Gamer.netの記事を見るのが早い。
西川善司の3DGE:新設の「プリミティブシェーダ」を搭載し,Radeon RX Vegaはどこへ行く?

注目の新機能ではあったが Vega(GFX9)では廃止、諦め、GFX10での実装に注力することとなった。
Making a GDS Allocation for NGG

DFSMと相性が良いはずで、廃止になってしまったのは残念。もしかしたら、DFSMの効果があまりなかったのに関係しているかもしれない。

具体的に何が原因で廃止になったかは不明。
GFX10ではGFX9から設計に変更があったらしいが、7GFX9でのNGGに何らかの問題があって変更したのか、
GFX10で変更することが決まったからGFX9では廃止したのか。

LLPC(LLVM-Based Pipeline)を見る限り、GFX10での実装はしっかりと進められている様子。
radeonsi/gfx10: document NGG shader stages - Mesa GitLab

感想

新機能にバグは付き物……
Vegaが久しぶりのハイエンドとして登場したために、残念なところが際立ってしまったように思う。
だがHBCC以外GFX10に引き継がれ、改良されているため決して無駄ではなかった。

参考リンク