Coelacanth's Dream

gfx940 で新たにサポートされる命令と XF32フォーマット

AMD の Stanislav Mekhanoshin 氏より、新たな CDNA系 GPUID gfx940 のサポートに向けたさらなるパッチが LLVM に投稿されている。
それらパッチによれば、gfx940 では行列演算命令、MFMA (Matrix-Fused-Multiply-Add) 系命令として新たな命令がいくつか追加され、またいくつかは Aldebaran/gfx90a/CDNA 2 からサポートが外される。

前提情報として、AMD GPU における MFMA命令名は V_MFMA_{CD}_{M}x{N}x{K}_{AB} のフォーマットからなり、{AB} は入力データフォーマット、{CD} は一時的な結果と最終的な出力データフォーマットを示し、{M,N,K} は行列のサイズを示す。
{M,N} は値に {4,16,32} のどれかを取り、{K} は {1,2,4,8,16,32} から取る。

Index

削除される MFMA系命令

gfx940 では MFMA系命令の従来の対応範囲から、V_MFMA_I32_{32X32X8,16X16X16}_I8V_MFMA_F32_{*}_BF16 が外される。
それら命令は Arcturus/gfx908/CDNA 1 の世代からサポートされていた。
V_MFMA_I32_{32X32X4,16X16X4,4X4X4}_I8 と、Aldebaran/gfx90a/CDNA 2 からサポートしている V_MFMA_F32_{*}BF16_1K はサポートが残されている。

追加される MFMA系命令

gfx940 では新たに 4個の MFMA命令、V_MFMA_I32_{32X32X16,16X16X32}_I8V_MFMA_F32_{32X32X4,16X16X8}_XF32 に対応する。
また、行列演算命令 (MAI, Matrix Arithmetic Instructions) として新たに SMFMAC 命令が追加された。

XF32

命令名の XF32 サフィックスは TF32 データフォーマットであることを示す。
TF32 そのままを命令名に使用しなかった理由には、ハードウェア仕様によるものと Stanislav Mekhanoshin 氏は説明している。1
TF32 は 19-bits 長のデータフォーマットであり、データのダイナミックレンジは FP32 と同じ 8-bits、精度は FP16 と同じ 10-bits となっている。(1-bit は符号 [sign] bit )

TF32 データフォーマットには、NVIDIA GPU では NVIDIA A100 からサポートしており、Intel GPU でも Ponte Vecchio (Xe-HPC) がサポートする。2
Ponte Vecchio (Xe-HPC) は他に QF, BF8 といったデータフォーマットをサポートするとしているが、詳細はまだ不明。
Xe-HPC のサポートが intel-graphics-compiler、oneDNN に追加される | Coelacanth’s Dream

Aldebaran/gfx90a/CDNA 2 では TF32 データフォーマットへのサポートが行われなかったが、gfx940 でサポートされ、他社 GPU と揃うことが明らかとなった。

SMFMAC

gfx940 でサポートされる SMFMAC 命令には、V_SMFMAC_F32_{16X16X32,32X32X16}_F16V_SMFMAC_F32_{16X16X32,32X32X16}_BF16V_SMFMAC_I32_{16X16X64,32X32X32}_I8 の 6個がある。
ただ正直、SMFMAC 命令が具体的にどういった命令で、MFMA 命令とどう異なるのかは、自分ではまだ読み取れていない。MFMA 命令から idx を指定する入力オペランドが追加されてはいるが。

 +    case Intrinsic::amdgcn_smfmac_f32_16x16x32_f16:
 +    case Intrinsic::amdgcn_smfmac_f32_32x32x16_f16:
 +    case Intrinsic::amdgcn_smfmac_f32_16x16x32_bf16:
 +    case Intrinsic::amdgcn_smfmac_f32_32x32x16_bf16:
 +    case Intrinsic::amdgcn_smfmac_i32_16x16x64_i8:
 +    case Intrinsic::amdgcn_smfmac_i32_32x32x32_i8: {
 +      // vdst, srcA, srcB, srcC, idx
 +      OpdsMapping[0] = getAGPROpMapping(MI.getOperand(0).getReg(), MRI, *TRI);
 +      OpdsMapping[2] = getVGPROpMapping(MI.getOperand(2).getReg(), MRI, *TRI);
 +      OpdsMapping[3] = getVGPROpMapping(MI.getOperand(3).getReg(), MRI, *TRI);
 +      OpdsMapping[4] = getAGPROpMapping(MI.getOperand(4).getReg(), MRI, *TRI);
 +      OpdsMapping[5] = getVGPROpMapping(MI.getOperand(5).getReg(), MRI, *TRI);
 +      break;
 +    }

V_MOV_B64

gfx940 には V_MOV_B64 命令のサポートも追加されている。
V_MOV_{*} 命令はデータの移動を行う基本的な命令であり、命令名のサフィックスはデータのサイズ (ビット幅) を示す。
Aldebaran/gfx90a/CDNA 2FullRateFP64 が実装されたが、V_MOV_B64 はサポートされていなかった。PackedFP32Ops の一部として V_PK_MOV_B32 命令のサポートはしていたため、V_MOV_B64 のサポートが gfx940 にずれ込んだ何らかの理由があるのかもしれないが、まあ不明である。

まだ gfx940 のサポートは途中だが、RDNA 2/GFX10.3 世代と同様に FeatureMadMacF32Insts (V_{MAD,MAC,MADAK,MADMK}_F32) の削除が行われていることと合わせ、対応命令の追加だけでなく整理も gfx940 で行われているような印象を受ける。
新たな CDNA系の GPUID 「gfx940」 | Coelacanth’s Dream

参考リンク