Coelacanth's Dream

LLVM に CDNA 系の GPU ID、gfx950 が追加

LLVM に gfx950 と新命令のサポートを追加するプルリクエストが AMD の Matt Arsenault 氏によって公開されている。
gfx950CDNA 3 の GPU ID である gfx94x と基本的な機能、ISA は共通しており、同様に CDNA 系の GPU ID だと考えられる。
ただ今回のプルリクエストでは FP4 と FP6 のデータフォーマットをサポートする命令は見られず、MI350/CDNA 4 ではなく、MI300/CDNA 3 のマイナーチェンジ版か MI325X に割り当てられた GPU ID の可能性が高いように思う。

    +def FeatureISAVersion9_5_Common : FeatureSet<
    +  !listconcat(FeatureISAVersion9_4_Common.Features,
    +  [FeatureFP8Insts,
    +   FeatureFP8ConversionInsts,
    +   FeatureCvtFP8VOP1Bug,
    +   FeatureGFX950Insts
    +   ])>;
    +

追加される行列演算命令と削除される TF32 のサポート

V_MFMA_F32_16X16X32_F16, V_MFMA_F32_32X32X16_F16 命令が gfx950 で追加された。
A (16x32) * B (32x16) + C (16x16)A (32x16) * B (16x32) + C (32x32) 形式の行列演算命令は CDNA 3 (gfx940) では、入力にサポートするデータフォーマットが BF8 か FP8 のみだったため、そこに FP16 が追加されたと見ることができる。

gfx950 では何故か XF32 フォーマットの行列演算命令のサポートが削除されている。
XF32 フォーマットは TF32 フォーマットを指し、フォーマット名が異なるのはハードウェアの仕様によるものと過去に説明されていた。
TF32 (XF32) は 19-bits 長のデータフォーマットであり、FP32 から仮数部 (精度) を FP16 と同じ 10-bits に減らしたものとなる。

CDNA 3 では TF32 フォーマットの行列のピーク性能は FP32 よりも高いものとなっていたため (NVIDIA GPU ほどのピーク性能差ではないが)、サポートする意義はあったと思うが。

    +    case GK_GFX950:
    +      Features["gfx950-insts"] = true;
    +      [[fallthrough]];
         case GK_GFX942:
         case GK_GFX941:
         case GK_GFX940:
           Features["fp8-insts"] = true;
           Features["fp8-conversion-insts"] = true;
    -      Features["xf32-insts"] = true;
    +      if (Kind != GK_GFX950)
    +        Features["xf32-insts"] = true;
           [[fallthrough]];

V_PRNG_B32

確率的丸め (Stochastic Rounding) のための命令、V_PRNG_B32gfx950 で追加された。
詳しくないため今回検索して初めて知ったが、機械学習において最近注目されているアプローチらしい。
丸め処理によって小さな値が潰れてしまうのを防ぐことができる。
AWS の機械学習専用チップ、AWS Trainium にもハードウェア実装されている。

V_CVT_F32_BF16

BF16 フォーマットを FP32 に変換する V_CVT_F32_BF16 命令が gfx950 で追加されている。
CDNA 3 (gfx94x) では BF8 を FP32 に変換する命令や、BF16 の行列を入力に取り、FP32 で出力する行列演算命令はサポートしていたが、単純に BF16 を FP32 に変換する命令はサポートしていなかった。

160 KB の LDS

gfx950 では LDS (Local Data Share) のサイズが 160 KB とされている。
従来の AMD GPU は LDS サイズが CU あたり 64 KB となっており、RDNA 系の GPU における WGP モードでも最大 128 KB だったため、gfx950 の LDS は大幅に増やされていることがわかる。

LDS は CU ごとに持つ高速なスクラッチメモリであり、サイズが大きくなれば活用できる状況が増え、性能が向上する可能性がある。
また、コンパイラは要求されるベクタレジスタ数に対してハードウェアのベクタレジスタが不足している場合、LDS に一部を割り当てる場合もある。