B.IOT¶
说明¶
B.IOT(Block Input and Output Tile Register)
本指令用于数据块指令块头中定义输入输出的Tile寄存器,并且指示输出的Tile 寄存器的大小。
汇编格式¶
- SrcTile0, SrcTile1: 指定两个输入 Tile 寄存器。
- reuse: 输入 Tile 寄存器的可选后缀。当存在时,表示所在块指令提交后,硬件不能释放对应的 Tile 寄存器(该寄存器将被后续指令再次读取)。
- last: 指示本指令是当前块的最后一条 B.IOT 指令。便于处理器判断一个块内的 B.IOT 指令序列是否完整表达了所需信息。
- DstTile: 指定输出 Tile 寄存器的类型:
T,U,M,N,ACC或S。 - 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 |
注意:
- 不同处理器实现支持的 Tile 寄存器尺寸范围由系统寄存器 LCFR 定义。
- 软件在申请 Tile 寄存器前,必须根据目标处理器的具体实现所支持的 Tile 寄存器大小进行分配。
指令编码¶
标志位说明如下:
Func字段用于指示有效输入Tile的数量,编码如下:
| Func | 含义 |
|---|---|
| 3b100 | 两输入:两个源Tile均有效。 |
| 3b101 | 一输入:仅第一个源Tile有效。 |
| 3b110 | 无输入:无源Tile,只有目标输出Tile。 |
| others | 其他编码均视为无效编码 |
SrcTile0 和 SrcTile1 字段的编码方式如下:
| 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:下面是一个三输入一输出的块指令:
由于每条B.IOT指令只能编码两输入一输出的Tile 寄存器,因此上述的3个输入Tile 寄存器需要编码在两条指令中:示例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>
...
注意事项¶
- 多个B.IOT组合使用时,最后一条B.IOT指令需要标记last。
- 一个块中只有一条B.IOT时,需要标记last。
- B.IOT中表达的输入输出Tile顺序必须与块指令的操作数顺序保持一致。
- 块体中访问了没有通过B.IOT指定的Tile寄存器,硬件应报异常。