架构与执行模型¶
执行单元¶
| 指令域 | 主要职责 | 常用状态或存储 |
|---|---|---|
| Scalar | 地址计算、整数/浮点标量运算、跳转、循环、标量访存、SPR | X 寄存器、条件状态、D-cache/系统地址 |
| Flow | 跳转、调用、循环、事件、屏障、内核结束 | PC、链接寄存器、事件槽 |
| MTE1 | L1 到 L0A/L0B/L0C 等片上层次的装载 | L1、L0A/B/C、BT |
| MTE2 | GM/OUT 到 UB/L1 的搬入、解压和图像加载 | GM、UB、L1 |
| MTE3 | UB/L1 到 GM/OUT 的搬出和压缩 | UB、L1、GM |
| Vector | 向量算术、比较、转换、归约、重排和 gather/scatter | UB、MASK、CMPMASK、VA |
| Cube | 普通或稀疏矩阵乘加 | L0A、L0B、L0C |
| Fixpipe | Cube 结果的转换、定点化和搬出 | L0C、UB/GM 等目标 |
执行关系可以概括为:
flowchart LR
GM["GM / OUT"] -->|MTE2| UB["UB"]
UB -->|Vector| UB
UB -->|MTE3| GM
GM -->|MTE2| L1["L1"]
L1 -->|MTE1| L0AB["L0A / L0B"]
L0AB -->|Cube| L0C["L0C"]
L0C -->|Fixpipe / MTE| GM
Scalar["Scalar / Flow"] -.地址、控制、同步.-> UB
Scalar -.事件.-> L0AB
机器字顶层分类¶
所有指令都是 32 位,word[31:29] 选择顶层指令域:
[31:29] |
指令域 | 目录项数 |
|---|---|---|
000 |
Scalar | 63 |
001 |
保留 | 0 |
010 |
Flow | 28 |
011 |
MTE | 36 |
100 |
Vector | 79 |
101 |
保留 | 0 |
110 |
Fixpipe | 2 |
111 |
Cube | 2 |
顶层分类不等于所有指令的最终执行位置。例如某些名称带 MOV 的搬运可能走 Vector 或 MTE,不应仅凭助记符前缀推断依赖关系。
异步执行¶
Scalar 按程序顺序发起 Vector、Cube 和 MTE 工作,但不同执行域可以重叠。下面的源码顺序本身不足以建立跨流水线依赖:
Vector 消费搬入结果前,需要匹配的事件等待或由编译器生成的同步序列。相同原则也适用于:
- MTE2 → Vector
- MTE2/MTE1 → Cube
- Cube → Fixpipe/MTE
- Vector → MTE3
Core 类型选择¶
Vector 与 Cube 目标应分别编译:
使用不带变体的 dav-c220 可能无法启用目标 builtin。驱动模式下应通过 -Xclang -target-cpu -Xclang ... 传递处理器名称。
函数接口概览¶
- 可见通用寄存器为
X0–X31。 - 生成代码通常从低编号 X 寄存器传递参数。
- 常见生成序列使用
X29作为帧指针、X30作为栈指针、X31作为链接寄存器。 RET返回到链接寄存器保存的位置。
手写函数如果与编译器生成代码互相调用,应以同一版本 bisheng 的输出作为 ABI 模板,不要自行假定跨版本调用约定。