Coelacanth's Dream

アドレス可能なベクタレジスタが従来の 4倍になる MI400/GFX12.5 APU

次世代の CDNA 系 APU として LLVM でサポート作業が進められている GFX12.5 (gfx1250/gfx1251) だが、シェーダーごとにアドレス可能な VGPR (Vector General Purpose Registers) が従来の 256個から 1024個へと、実に 4倍にもなることが明らかにされている。

GFX12.5 (gfx1250/gfx1251) は次世代 CDNA 系 APU (おそらく CDNA 5) とされているが、アーキテクチャとしては RDNA 4/GFX12 をベースとしており、行列積和演算系の命令も従来の CDNA 系アーキテクチャがサポートしてきた MFMA (Matrix fused-multiply-add) 命令ではなく WMMA (Wave Matrix Multiply Accumulate) 命令を採用し、Dual Issue もサポートする。
また、Wave32 モードのみをサポートし、従来の CDNA 系がサポートしてきた Wave64 はサポートしないという特徴を持つ。

256個を超えるベクタレジスタを指定する方法

GFX12.5 ではアドレス可能なベクタレジスタ数が 1024個に大幅に増えたが、従来の命令エンコーディングでは出力先のベクタレジスタ (VDST) を指定するフィールドが 8-bit までしか用意されておらず、256個を超えるベクタレジスタを指定することができない。
かといって命令エンコーディングを変更すれば、従来の世代との互換性が破壊されてしまう。
そこで GFX12.5 では S_SET_VGPR_MSB 命令を追加し、ベクタレジスタのアドレス上位 2-bit を追加で指定できるようにすることで、拡張と互換性の維持を同時に達成している。
S_SET_VGPR_MSB 命令で指定可能な値のフォーマットは以下のようになっており、下位から 2-bit ごとに src0, src1, src2, dst へのアドレス上位 2-bit を割り当てている。

    /// S_SET_VGPR_MSB uses: (src0[0-1], src1[2-3], src2[4-5], dst[6-7])

アドレス可能なベクタレジスタ数が増えることで、変数がベクタレジスタに収まらずに溢れ、ローカルメモリである LDS (Local Data Share) やメモリに退避させるようなケースを減らし、高速なベクタレジスタだけで完結させることが可能になる。

また、少ない Wave数で最大限物理レジスタ数を活用できるようになるが、これは言い換えれば、同時に起動できる Wave数が少なくなることにも繋がる。この問題は従来のアーキテクチャにも言えるため、要はバランスの問題である。
RDNA 4/GFX12 からサポートされている Dynamic register allocation / Dynamic VGPR と合わせ、ベクタレジスタの割り当てと同時に起動可能な Wave数をより柔軟に調整することが可能になり、ハードウェアの性能を引き出せるのではないかと考えられる。

参考リンク