Coelacanth's Dream

Linux Kernel に CPU + GPU の統合メモリ空間をサポートする最初のパッチが投稿される

Linux Kernel (amd-gfx) に、HMM (Heterogeneous Memory Management) をベースとする SVM (Share Virtual Memory) のサポートを追加する最初のパッチが投稿された。

最初のパッチということで、まだ IOMMU が有効だと動作しなかったり、バグや性能への問題があるとしており、正式なサポートがメインラインに組み込まれるまでは時間が掛かると見られる。

3rd Gen AMD Infinity Architecture

AMD は 3rd Gen AMD Infinity Architecture で CPU と GPU のメモリ空間を統合する構想を明らかにしており、今回のパッチはそれに向けたものと思われる。
Arcturus/MI100 は 2nd Gen となり、最大 8 GPUでの接続をサポートするが、CPU と GPU のメモリ空間は独立しており、CDNA 2 アーキテクチャ から 3rd Gen AMD Infinity Architecture が実装される。
CDNA 2 については、GPU コードネームはまだ出てきておらず、Linux Kernel へのパッチも投稿されていないが、MI200 という製品名はちらほら出てきている。

3rd Gen AMD Infinity Architecture

3rd Gen AMD Infinity Architecture

メモリ空間が統合されることの意義は、メモリ管理やデータの同期等をプログラム側で意識する必要性が減ることにあり、より広い用途での GPU の活用が期待される。

3rd Gen ではメモリ空間の統合だけでなく、CPU と GPU 間の帯域が向上し、レイテンシも削減されるとしている。
画像では PCIe Gen4 の倍近い帯域となっており、PCIe Gen5 での実装を想定していると思われる。

AMD 3rd Gen Infinity Architecture Enables Accelerated Computing

AMD 3rd Gen Infinity Architecture Enables Accelerated Computing

SVM

Vega/GFX9 に搭載されている HBCC (High-Bandwidth Cache Controller) は 49-bit アドレッシングをサポートしており、それにより最大 512TB の仮想アドレス空間の確保が可能となっている。
最新の CPU でも、仮想アドレス空間は 48-bit までというのがほとんどであり、HBCC はそれを十分にカバーできる。
GFX8 とそれ以前の AMD GPU では HBCC も無く、49-bit アドレッシングもサポートしていないため、今回のパッチの対象からは外れる。
また、マーケティング的な理由から HBCC の名は使われなくなったが、Vega10 以降の Vega20Arcturus/MI100 、RDNA系となる Navi1x/Navi2x でも 49-bitアドレッシングはサポートしていると思われる。

仮想メモリ空間には、複数の GPU も含まれており、GPU間での移行もサポートされている。
だが、ある GPU から別の GPU にアクセスできない場合があるとして、システムメモリをブリッジとして使用して移行する方法を採っている。
コード内のコメントから、移行先と移行元の GPU 両方が PCIe large bar Above 4G Decoding、最近 Smart Access Memory を切っ掛けに話題となった Resizable PCI BAR のことと思われる を有効にされている場合、または XGMI / Infinity Fabric Link で接続され、同じトポロジ内の Hive にある場合は、
ブリッジにシステムメモリを使うことなく移行するように今後変更されると思われる。

   +	 * TODO: for both devices with PCIe large bar or on same xgmi hive, skip
   +	 * system memory as migration bridge
   +	 */

XNACK

SVM の実装には XNACK という機能が活用されている。
XNACK はページフォールトが発生した時の、物理メモリを仮想メモリに割り当てる Demand Paging (デマンドページング) やページの移行を行なう Page Migration に使われる機能。1
APU では GFX8 世代から、dGPU では Vega/GFX9 世代からサポートされている。

Vega/GFX9 でサポートされていた、広帯域な HBM2メモリをキャッシュとし、CPU の持つシステムメモリの一部も VRAM として効率的に扱う、機能としての HBCC にも XNACK が使われていた。

XNACK を有効としてコンパイルされたコードを XNACK が無効になっている GPU で実行すると、正しく実行されない、実行されたとしても性能が低下する可能性があることから、コンパイラバックエンドである LLVM 等では、無効時は Vega10 の GFX ID を gfx900 、有効時は gfx901 として区別していた。
だがこうした命名規則は途中で廃され、有効時でも Vega10gfx900 とされるようになった。2
途中で廃した (最初はサポートするつもりだった) ことから、HBCC を Linux環境でもサポートすることや、あるいは 49-bitアドレッシングのサポートも合わせ、Vega10 の頃に今回のパッチのような CPU と GPU の共有メモリを実装する計画があったのかもしれないが、その真実は AMD のみぞ知る。

XNACK は APU ではデフォルトで有効となっており3、そういった点も合わせ、CPU と GPU のメモリ空間の統合、3rd Gen AMD Infinity Architecture はサーバー向けプロセッサと GPU をまとめあげることで巨大な APU のように見せ、HPC等への活用を可能とする機能とも言える。

参考リンク