跳转至

B.IOT

说明

B.IOT(Block Input and Output Tile Register)

本指令用于数据块指令块头中定义输入输出的Tile寄存器,并且指示输出的Tile 寄存器的大小。

汇编格式

    B.IOT SrcTile0<.reuse>, SrcTile1<.reuse> <,last>, ->DstTile<Size>
  • SrcTile0, SrcTile1: 指定两个输入 Tile 寄存器。
  • reuse: 输入 Tile 寄存器的可选后缀。当存在时,表示所在块指令提交后,硬件不能释放对应的 Tile 寄存器(该寄存器将被后续指令再次读取)。
  • last: 指示本指令是当前块的最后一条 B.IOT 指令。便于处理器判断一个块内的 B.IOT 指令序列是否完整表达了所需信息。
  • DstTile: 指定输出 Tile 寄存器的类型:T, U, M, N, ACCS
  • Size: 指定输出 Tile 寄存器空间大小的立即数。其有效范围请见Tile寄存器介绍。

输出 Tile 寄存器的大小通过立即数 imm4 指定,计算公式为:Size = 16 Byte * (2^imm4)。其中 imm4 的有效取值范围为 0 到 15。

imm4 Size imm4 Size imm4 Size imm4 Size
0 0B 4 256B 8 4KB 12 64KB
1 32B 5 512B 9 8KB 13 128KB
2 64B 6 1KB 10 16KB 14 256KB
3 128B 7 2KB 11 32KB 15 512KB

注意:

  1. 不同处理器实现支持的 Tile 寄存器尺寸范围由系统寄存器 LCFR 定义。
  2. 软件在申请 Tile 寄存器前,必须根据目标处理器的具体实现所支持的 Tile 寄存器大小进行分配。

指令编码

B.IOT

标志位说明如下:

Func字段用于指示有效输入Tile的数量,编码如下:

Func 含义
3b100 两输入:两个源Tile均有效。
3b101 一输入:仅第一个源Tile有效。
3b110 无输入:无源Tile,只有目标输出Tile。
others 其他编码均视为无效编码

SrcTile0SrcTile1 字段的编码方式如下:

SrcTile 寄存器 SrcTile 寄存器 SrcTile 寄存器 SrcTile 寄存器
0 T#1 16 U#1 32 M#1 48 N#1
1 T#2 17 U#2 33 M#2 49 N#2
2 T#3 18 U#3 34 M#3 50 N#3
3 T#4 19 U#4 35 M#4 51 N#4
4 T#5 20 U#5 36 M#5 52 N#5
5 T#6 21 U#6 37 M#6 53 N#6
6 T#7 22 U#7 38 M#7 54 N#7
7 T#8 23 U#8 39 M#8 55 N#8
8 T#9 24 U#9 40 M#9 56 N#9
9 T#10 25 U#10 41 M#10 57 N#10
10 T#11 26 U#11 42 M#11 58 N#11
11 T#12 27 U#12 43 M#12 59 N#12
12 T#13 28 U#13 44 M#13 60 N#13
13 T#14 29 U#14 45 M#14 61 N#14
14 T#15 30 U#15 46 M#15 62 N#15
15 T#16 31 U#16 47 M#16 63 N#16

S0R(Source0 Reuse)S1R(Source1 Reuse) 字段的含义与编码方式如下表:

标志位 含义 编码方式
S0R(Source0 Reuse) SrcTile0的 reuse 标志位 0:无reuse标记;1:有reuse标记。
S1R(Source1 Reuse) SrcTile1的 reuse 标志位 0:无reuse标记;1:有reuse标记。

DstTile 字段编码方式如下:

DstTile 寄存器队列 DstTile 寄存器队列
0 输出到 T队列 4 保留
1 输出到 U队列 5 输出到 S队列
2 输出到 M队列 6 保留
3 输出到 N队列 7 本字段无效

汇编示例

示例1:下面是一个三输入一输出的块指令:

TMATMUL.BIAS <M:xx, N:xx, K:xx> T#1, T#3, U#1, ->T<16KB>
由于每条B.IOT指令只能编码两输入一输出的Tile 寄存器,因此上述的3个输入Tile 寄存器需要编码在两条指令中:
    B.IOT T#1, T#3                # 编码前两个输入
    B.IOT U#1, last, ->T<16KB>    # 编码第三个输入和输出,标记last

示例2:

VPAR T#2, T#3, U#1, U#2, T#1, ->T<4KB>
# 展开序列:
BSTART.VPAR
B.IOT T#2, T#3
B.IOT U#1, U#2
B.IOT T#1, last, ->T<4KB>
...

注意事项

  1. 多个B.IOT组合使用时,最后一条B.IOT指令需要标记last。
  2. 一个块中只有一条B.IOT时,需要标记last。
  3. B.IOT中表达的输入输出Tile顺序必须与块指令的操作数顺序保持一致。
  4. 块体中访问了没有通过B.IOT指定的Tile寄存器,硬件应报异常。