最近になって AMD の開発者より LLVM に GFX11 の新機能、新命令のサポートを追加するパッチが続いて投稿されている。
そして今回、AMD の Joe Nash 氏より、GFX11 の新命令として WMMA (Wave Matrix Multiply-accumulate)
のサポートを追加するパッチが投稿された。
WMMA (Wave Matrix Multiply-accumulate)
WMMA
は行列の積和演算を行う命令であり、CDNA 系アーキテクチャ でサポートされている MFMA (Matrix-Fused-Multiply-Add)
命令と同様に学習、推論処理の高速化を目的とした命令と思われる。
// WMMA (Wave Matrix Multiply-Accumulate) intrinsics // // These operations perform a matrix multiplication and accumulation of // the form: D = A * B + C .
WMMA
命令には以下の 6個が存在する。
MFMA
命令と同様のフォーマットとすると、V_WMMA_{CD}_{M}x{N}x{K}_{AB}
と置いた場合、{AB}
は入力データフォーマット、{CD}
は加算する行列と最終的な出力データフォーマットを、{M,N,K}
は行列のサイズを示す。
GFX11 の WMMA
命令は、入力データフォーマットに F16,BF16,IU8,IU4
、出力データフォーマットに F32,F16,BF16,I32
をサポートしている。
命令ごとの対応関係は F16->F32, BF16->F32, F16->F16, BF16->BF16, IU8->I32, IU4->I32
となる。
defm V_WMMA_F32_16X16X16_F16 : VOP3P_Real_WMMA <0x040>; defm V_WMMA_F32_16X16X16_BF16 : VOP3P_Real_WMMA <0x041>; defm V_WMMA_F16_16X16X16_F16 : VOP3P_Real_WMMA <0x042>; defm V_WMMA_BF16_16X16X16_BF16 : VOP3P_Real_WMMA <0x043>; defm V_WMMA_I32_16X16X16_IU8 : VOP3P_Real_WMMA <0x044>; defm V_WMMA_I32_16X16X16_IU4 : VOP3P_Real_WMMA <0x045>;
MFMA
と WMMA
の違いには、MFMA
は入出力に F64
フォーマットをサポートし、WMMA
は F64
をサポートしないが入力に IU4
を、出力に F16
サポートしている点、
MFMA
は複数の行列レイアウトに対応するが WMMA
は 16x16x16 に固定されている点が挙げられる。
ここでの MFMA
命令は CDNA 2/gfx90a/MI200/Aldebaran がサポートしている範囲を指している。
AMDGPU | MFMA (CDNA 2) | WMMA (GFX11) |
---|---|---|
Register type | AccVGPR | VGPR |
Input format | F32, F16, I8, BF16, F64 | F16, BF16, IU8, IU4 |
Output format | F32, I32, F64 | F32, F16, BF16, I32 |
Matrix layout | {4,16,32}x{4,16,32}x{2,4,8,16} | 16x16x16 |
GFX11 では Wave32 と Wave64 の両方に対応するが、WMMA
命令では Wave のサイズによって割り当てられるレジスタリソースが異なっている。
class VOPProfileWMMA<VOPProfile P, string Suffix, RegisterOperand _Src01RC64, bit _HasClamp, bit _HasOpSel> : VOP3P_Profile<P> { let DstRC = !if(!eq(Suffix, "_w32"), VDst_256, VDst_128); let Src0RC64 = _Src01RC64; let Src1RC64 = _Src01RC64; let Src2RC64 = !if(!eq(Suffix, "_w32"), VISrc_256_f64, VISrc_128_f32); let HasClamp = _HasClamp; let HasOpSel = _HasOpSel; let IsWMMA = 1; }
NVIDIA GPU 向けの CUDA にも Tesor Core が対応する命令、それを利用するための API として WMMA (Warp Matrix Multiply Accumulate)
はあり、言葉としては Warp か Wave かの違いとなる。
機能や名称から、GFX11 の WMMA
命令は NVIDIA GPU をある程度意識して追加された命令のように思える。
AMDGPU GFX11 における WMMA
は現状行列のサイズが 16x16x16 で固定されているのに対し、NVIDIA GPU と CUDA における WMMA
はアーキテクチャにもよるが、16x16x16 以外に 32x8x16 や 8x8x4 (FP64)、8x8x128 (B1) にも対応するといった違いもある。
Intel GPU では、DPAS (Dot Product Accumulate Systolic)
命令、XMX (Xe Matrix eXtension) とも呼ぶユニットが NVIDIA Tensor Core に相当する。1
Fused EU 構成を採用する Xe-HP/HPG では内部的に行列ブロックを 2つ分解して実行する DPASW (Wide)
命令もサポートしている。2
CDNA 系アーキテクチャ がサポートする MFMA
命令は miSIMD (Machine Intelligence SIMD) で実行する方式だったが、GFX11 でも同様のユニットを用いるかは不明。
ただ今回のパッチでは通常のベクタレジスタ (VGPR) を指定しているため、miSIMD と専用の AccVGPR を用いる CDNA 系アーキテクチャ とは異なる方式であることが可能性として考えられる。
GFX11 に AccVGPR があることを示すようなパッチも現状投稿されていない。
CDNA 1/gfx908/MI100/Arcturus では SIMD と VGPR、miSIMD と AccVGPR が分けて実装されている。
CDNA 2/gfx90a/MI200/Aldebaran からは VGPR と AccVGPR が統合され、MFMA
命令を実行するにはオフセットを指定して分割する必要があるが、それぞれのレジスタサイズは柔軟に変更可能となった。
CDNA 2 アーキテクチャでは Unified Register Files を実装 | Coelacanth’s Dream
CDNA 3/gfx940/MI300 では XF32 (TF32, 19-bit) フォーマットに対応し、また SMFAC
命令が追加される。
gfx940 で新たにサポートされる命令と XF32フォーマット | Coelacanth’s Dream