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}_I8
と V_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}_I8
と V_MFMA_F32_{32X32X4,16X16X8}_XF32
に対応する。
また、行列演算命令 (MAI, Matrix Arithmetic Instructions) として新たに SMFMAC 命令が追加された。
- [AMDGPU] New gfx940 mfma instructions · llvm/llvm-project@27439a7
- [AMDGPU] Support gfx940 smfmac instructions · llvm/llvm-project@6e3e14f
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}_F16
、V_SMFMAC_F32_{16X16X32,32X32X16}_BF16
、V_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 2 で FullRateFP64
が実装されたが、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