跳转至

块头定义

矩阵数据块的块头需要定义执行哪类矩阵运算操作、输入矩阵的尺寸和输入输出的Tile寄存器等信息。

汇编格式

TileOp <LB0:arg0, LB1:arg1, LB2:arg2, DataType>, SrcTile0<.reuse>, ..., SrcTile7<.reuse>, DepSrc0, DepSrc1, DepSrc2, 
                                     ->DstTile0<TileSize0>, ..., DstTile3<TileSize3>, DepDst

各参数说明如下:

参数 说明 是否可选
TileOp 指定矩阵运算的具体操作,可选:TMATMUL, ACCCVT等
LB0 输入矩阵的行或列参数,具体见特定指令介绍。arg0可以通过(全局寄存器立即数全局寄存器加立即数)参数设置。 是,默认为1
LB1 输入矩阵的行或列参数,具体见特定指令介绍。arg1可以通过(全局寄存器立即数全局寄存器加立即数)参数设置。 是,默认为1
LB2 输入矩阵的行或列参数,具体见特定指令介绍。arg2可以通过(全局寄存器立即数全局寄存器加立即数)参数设置。 是,默认为1
DataType 输入元素的数据格式,包括FP32, FP16, S16等
SrcTile0, ..., SrcTile7 分别指示最多8个输入的Tile寄存器。
reuse 当本指令执行结束后相应的输入Tile寄存器不允许被释放则需要增加该标识。如无此标识,则表示允许硬件释放本寄存器。
DstTile0, ..., DstTile3 分别指示最多4个输出Tile寄存器类型 可选T, U, M, N或ACC。
TileSize0, ..., TileSize3 分别指示每个输出Tile寄存器的空间大小,可以通过一个 立即数或者全局寄存器传参。 取决于DstTile
DepSrc0, DepSrc1, DepSrc2 表示本块指令最多显式记录 3 个前序 D 依赖槽位。
DepDst 表示本块指令对后序引用该标识的块指令的屏障。

编码方式

一条完整矩阵数据块指令块头需要拆分成以下多条指令进行编码,其中包括:

  • BSTART.CUBE TileOp, DataType
  • B.DATR Layout.{canon, normal}, DataType
  • B.DIM reg, imm, ->LB0
  • B.DIM reg, imm, ->LB1
  • B.DIM reg, imm, ->LB2
  • B.IOT SrcTile0<.reuse>, SrcTile1<.reuse>, ->DstTile0< TileSize0>
  • ...
  • B.IOT SrcTile6<.reuse>, SrcTile7<.reuse>, last, ->DstTile3< TileSize3>
  • B.IOD DepSrc0, DepSrc1, DepSrc2, ->DepDst

其中,BSTART.CUBE指令的编码格式如下:

BSTART.CUBE

其中,function字段用于编码具体的矩阵运算/FIXPIPE指令。编码方式如下:

Mode Function 操作
0 0 TMATMUL
0 1 TMATMUL.BIAS
0 2 TMATMUL.ACC
0 3 预留编码
0 4 TMATMULMX
0 5 TMATMULMX.BIAS
0 6 TMATMULMX.ACC
0 7 预留编码
0 8 ACCCVT
0 9-15 预留编码
0 16 TGEMV
0 17 TGEMV.BIAS
0 18 TGEMV.ACC
0 19 预留编码
0 20 TGEMVMX
0 21 TGEMVMX.BIAS
0 22 TGEMVMX.ACC
0 23-31 预留编码

DataType字段编码方式如下:

编码 数据类型 编码 数据类型 编码 数据类型 编码 数据类型
0 FP64 8 E5M2 16 S64 24 U64
1 FP32 9 E3M2 17 S32 25 U32
2 TF32 10 E2M3 18 S16 26 U16
3 HF32 11 E2M1x2 19 S8 27 U8
4 FP16 12 E1M2x2 20 S4x2 28 U4x2
5 BF16 13 E8M0 21 reserve 29 reserve
6 HiF8 14 HiF4x2 22 reserve 30 reserve
7 E4M3 15 reserve 23 reserve 31 invalid