块头定义¶
访存数据块的块头用于定义Group间的执行模式、块体的执行次数、输入输出的Tile寄存器和全局寄存器以及与其他块指令之间的执行依赖等信息。并且由于访存数据块只能是分离块形式的,因此块头中还需要指示块体的位置。
汇编格式¶
访存并行块的块头:
MPAR .body, <LB0:arg0, LB1:arg1, LB2:arg2, VSize, DR>, SrcTile0<.reuse>, ..., SrcTile7<.reuse>, [BGetList], DepSrc0, DepSrc1, DepSrc2,
->DstTile0<TileSize0>, ..., DstTile3<TileSize3>, [BSetList], DepDst
MSEQ .body, <LB0:arg0, LB1:arg1, LB2:arg2, VSize, DR>, SrcTile0<.reuse>, ..., SrcTile7<.reuse>, [BGetList], DepSrc0, DepSrc1, DepSrc2,
->DstTile0<TileSize0>, ..., DstTile3<TileSize3>, [BSetList], DepDst
各汇编参数说明如下:
| 参数 | 说明 | 是否可选 |
|---|---|---|
| .body | 块体位置的程序标签。 | 否 |
| LB0 | 最内层循环上限参数,可以通过arg0(全局寄存器、立即数或全局寄存器加立即数)参数设置。 |
是,默认为1 |
| LB1 | 中间层循环上限参数,可以通过arg1(全局寄存器、立即数或全局寄存器加立即数)参数设置。 |
是,默认为1 |
| LB2 | 最外层循环上限参数,可以通过arg2(全局寄存器、立即数或全局寄存器加立即数)参数设置。 |
是,默认为1 |
| VSize | 块内使用的向量寄存器的数量,分为两档: VS16:块内需要使用4组寄存器,每组4个。 VS8:块内需要使用2组寄存器,每组4个。 |
是,默认vs16 |
| DR | 指示块体迭代展开后如何调度到Group执行的参数,分为降维模式DR和多维模式两种 | 是,默认多维模式 |
| SrcTile0, ..., SrcTile7 | 分别指示最多8个输入的Tile寄存器。 | 是 |
| reuse | 当本指令执行结束后相应的输入Tile寄存器不允许被释放则需要增加该标识。如无此标识,则表示允许硬件释放本寄存器。 | 是 |
| DstTile0, ..., DstTile3 | 分别指示最多4个输出Tile寄存器类型 | 可选T, U, M或N。 |
| TileSize0, ..., TileSize3 | 分别指示每个输出Tile寄存器的空间大小,可以通过一个 立即数或者全局寄存器传参。 |
取决于DstTile |
| [BGetList] | 全局寄存器GGPR输入列表。 | 是 |
| [BSetList] | 全局寄存器GGPR输出列表。 | 是 |
| DepSrc0, DepSrc1, DepSrc2 | 表示本块指令最多显式记录 3 个前序 D 依赖槽位。 |
是 |
| DepDst | 表示本块指令对后序引用该标识的块指令的屏障。 | 是 |
编码方式¶
一条完整访存数据块指令块头需要拆分成以下多条指令进行组合编码,其中包括:
BSTART.MPAR或BSTART.MSEQVSize。- B.CATR
DR。 - 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.IOR
RegSrc0, RegSrc1, RegSrc2, ->RegDst0 ...- B.IOR
RegSrc9, RegSrc10, RegSrc11, ->RegDst4 - B.IOD
DepSrc0, DepSrc1, DepSrc2, ->DepDst。
其中,BSTART.MPAR指令的编码格式如下:
BSTART.MSEQ指令的编码格式如下:
其中,mode字段用于编码VSize信息。
| 编码 | VSize |
|---|---|
| 0 | VS8 |
| 1 | VS16 |
| 2 | VS32,当前版本保留 |
| 3 | VS64,当前版本保留 |
为了降低块头指令的长度,向量数据块的BSTART提供了一种16bit 压缩版本的编码,编码方式如下:
C.BSTART.MPAR指令编码:
C.BSTART.MSEQ指令编码:
压缩版本的指令没有VSize字段,并且默认VSize = VS16。
汇编示例¶
示例1:块内使用到2组向量寄存器: vt, vu
hed:
MPAR .foo, <LB0:64, LB1:10, VS8>, [a0, a1], ->T<8KB>
...
.foo:
v.lwi [ri0, lc0<<2, 0], ->vt.w
v.lwi [ri0, lc0<<2, 4], ->vt.w
v.mul vt#1,.sw, vt#2.sw, ->vt.w
v.sw vt#1.sw, [TO, lc0<<2]
...
v.lwi [ri1, lc0<<2, 0], ->vu.w
v.lwi [ri1, lc0<<2, 4], ->vu.w
v.add vu#1,.sw, vu#2.sw, ->vt.w
v.sw vt#1.sw, [TO, lc0<<2]
示例2:块内使用到4组向量寄存器: vt, vu, vm, vn
hed:
MPAR .foo, <LB0:64, LB1:10, VS8>, [a0], ->T<8KB>
...
.foo:
v.lwi [ri0, lc0<<2, 0], ->vt.w
v.lwi [ri0, lc0<<2, 4], ->vu.w
v.mul vt#1,.sw, vu#1.sw, ->vt.w
v.sw vt#1.sw, [TO, lc0<<2]
...
v.lwi [ri1, lc0<<2, 0], ->vm.w
v.lwi [ri1, lc0<<2, 4], ->vn.w
v.add vm#1,.sw, vn#1.sw, ->vt.w
v.sw vt#1.sw, [TO, lc0<<2]