Coelacanth's Dream

AMD Smart Access Memory 再調査 ―― Bulldozer世代の CPU/APU でも有効可能

約 1ヶ月前に検証した機能、AMD Smart Access Memory だが、思う所があったため、再度情報を調査、整理することとした。
Linux環境と Ryzen 5 2600、Radeon RX 560 で “Smart Access Memory” 機能を試す | Coelacanth’s Dream 性能については自環境を特に更新してないため見送る。

Linuxには 2017年に実装

前回は何年前と書いたが、Linux Kernelのレポジトリ、パッチアーカイブを調査する中で、Smart Access Memory の実態である Resizeable PCI BAR を実装するパッチは 2017/03 に投稿されていたことがわかった。

PCI部への最初のパッチは 2015/12 に投稿されたが、その時は組み込まれず、AMDGPUドライバーに合わせた 2017/03 にまたパッチが投稿された。

その後もアップデートを重ね、Linux Kernel のレポジトリを検索したところでは、2017/12 頃メインラインに組み込まれている。

一連のパッチを投稿した Christian König 氏は AMD GPU のオープンソースドライバー等を長年担当しているソフトウェアエンジニアである。1
氏は Resizeable PCI BAR を実装する構想を持ってから、1年以上経ってようやく完成させることができた、とコメントしている。
従来の PCI BAR は 32-bit システムとの互換性を理由に、CPU から GPU へ一度にアクセス可能なサイズを 256MB としていたが、Resizeable PCI BAR をサポートすることにより、GPU が持つ数GBのローカルメモリに CPU がアクセス可能となる。
また、Christian König 氏はドライバー側のリサイズ機能と同時に、AMD Family 15h (Bulldozer 世代の CPU/APU) で 64-bit bar を有効する機能も追加しており、。現時点のコードを見てもそれは残っている。2
[PATCH 3/4] x86/PCI: Enable a 64bit BAR on AMD Family 15h (Models 30h-3fh) Processors

RDNA /GFX10 世代以降で有効にするパッチは 2020/05 に投稿されていた。3
それと同時期に一度、Above 4G decoding のような 64-bit bar が無効になっている場合、Linux Kernel にメッセージを出力するパッチが投稿されたが、多くの人にとってはスパムになってしまうだろう、という理由から組み込まれずに取り下げられている。4
また、APU 厳密には APU 内の統合 GPU に対してはこの機能が有効とされないよう判定が行なわれている。

   	if (!(adev->flags & AMD_IS_APU)) {
   		r = amdgpu_device_resize_fb_bar(adev);
   		if (r)
   			return r;
   	}

自分が Smart Access Memory/Resizeable PCI BARAbove 4G decoding 等の機能を知ったきっかけは、AMD GPUドライバーの開発者である Alex Deucher 氏が、Phoronix による Radeon RX 6000シリーズ についての記事に投稿したコメントだったが、
こうしたドライバーへの実装を行なった開発者方にとって、ユーザー層がこうした機能に今更騒いでいるのはいささか不思議に思われたかもしれない。

改めて AMD 公式サイトの Smart Access Memory を解説したページを見ると、ある意味で 丁寧に、
従来型のWindowsベースのPCシステムでは (引用元: AMD Smart Access Memory | AMD )、
とある。 AMD としては Linux 等のシステムでは既に実装していることは分かっており、それを Windowsにも実装する時、マーケティング的な価値が十分にあると考えたのだろう。

また、KTU こと加藤勝明 氏による検証で、Intel環境でも Smart Access Memory/ Resizeable PCI BAR を有効可能であり、効果が確かに出ていることが判明している。Linux でもこれは同様と思われる。
ASCII.jp:Intel環境でもRadeon RX 6000シリーズのSmart Access Memoryが使えるのか検証してみた (1/2)

前回も書いたが、Linux環境で Smart Access Memory / Resizeable PCI BAR が有効にされているかは、

 $ AMD_DEBUG="info" glxinfo -B | grep vram_vis_size

または以下のコマンドで確認できる。上記の場合は値が VRAM と同じサイズとなっていれば、下記の場合は BAR= の後の値が VRAM と同じサイズであれば有効化されている。

% dmesg | grep "Detected VRAM"

個人的結論