Coelacanth's Dream

RadeonSI ドライバーの Smart Access Memory 向け最適化がデフォルトで無効に

先日 Mesa3D にマージされた AMD GPU 向け OpenGL ドライバー、RadeonSI への変更の中で、ResizableBAR (Base Address Register) /Smart Access Memory (SAM) 向けの最適化をデフォルトで無効化するものがあった。
元々 RadeonSI では ResizableBAR/SAM が有効な場合、実際の判定としては CPU-accessible/visible VRAM のサイズを見て充分なサイズがある場合にそれ向けの最適化を有効化していたが、後に安定してすべてのプラットフォームで性能向上を得られる訳ではないとして、とりあえず >=Zen 3 CPU + >=RDNA 2 GPU の組み合わせでのみデフォルトで有効化する処置が取られた。1
それが今回、ゲームによっては最適化が逆に働き、著しく遅くなることが報告されたため、どのプラットフォームであってもデフォルトで無効化することとなった。

性能が低下する原因として当該 issue では、GPU VRAM への CPU アクセスによるオーバヘッドが増え、それにより GPU の使用率が上がらないことが挙げられている。

    +   sscreen->info.smart_access_memory = false; /* VRAM has slower CPU access */
    +

同様の現象は Direct3D 12 (D3D12) の Vulkan 実装、VKD3D と RADV ドライバーの組み合わせでも報告されているが、オプションの VKD3D_CONFIG=no_upload_hvv により BAR 領域 (VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT | VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT) を使わないようにすることで回避可能ということで VKD3D 側の問題として close された。

AMD が ResizableBAR を Smart Access Memory という名前を付けてマーケティング的に打ち出してから 2年以上経つが、ResizableBAR/SAM とそれ向けの最適化が実際に性能を向上させるかは一部 (主に Linux 環境) で話題になり続けていると感じる。
VKD3D の CHANGELOG.md にある記述によれば、D3D12 では BAR 領域を明示的に使用可能とするヒープメモリタイプが無いとしている。このことが主に Linux 環境でのみ話題になっていることと関係しているかもしれない。2

多くのアプリケーション、ゲームでは性能が向上する一方で、逆に性能が低下するものもあるという点がこの問題の難しい部分だろう。
VKD3D の同様部分では、ResizableBAR/SAM の効果はゲームによって異なるとしつつも、ベストケースでは 10-15% の性能向上が確認できるとしている。それほどの性能向上を見ながら活用しないのは、性能を重視するユーザーや開発者にとっては惜しい話だ。
最初に取り上げた AMD の Marek Olšák 氏によるマージリクエストも、当初は最適化のデフォルトでの無効化だけでなく、最適化に関するコードを削除するコミットも含まれていたが、後に更新されて無効化のみとなった。
今後調査が進めば、RadeonSI ドライバーで ResizableBAR/SAM 向けの最適化が再度有効化されるかもしれない。

(追記)

その後、別のマージリクエストで ResizableBAR/SAM の最適化に関するコードが削除された。

(追記終了)

参考リンク