跳转至

架构与执行模型

执行单元

指令域 主要职责 常用状态或存储
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 工作,但不同执行域可以重叠。下面的源码顺序本身不足以建立跨流水线依赖:

MOV_OUT_TO_UB [X0], [X1], X2
VADD.s16 [X3], [X0], [X4], X5, MASK

Vector 消费搬入结果前,需要匹配的事件等待或由编译器生成的同步序列。相同原则也适用于:

  • MTE2 → Vector
  • MTE2/MTE1 → Cube
  • Cube → Fixpipe/MTE
  • Vector → MTE3

Core 类型选择

Vector 与 Cube 目标应分别编译:

dav-c220-vec  -> Vector/AIV 内核
dav-c220-cube -> Cube/AIC 内核

使用不带变体的 dav-c220 可能无法启用目标 builtin。驱动模式下应通过 -Xclang -target-cpu -Xclang ... 传递处理器名称。

函数接口概览

  • 可见通用寄存器为 X0X31
  • 生成代码通常从低编号 X 寄存器传递参数。
  • 常见生成序列使用 X29 作为帧指针、X30 作为栈指针、X31 作为链接寄存器。
  • RET 返回到链接寄存器保存的位置。

手写函数如果与编译器生成代码互相调用,应以同一版本 bisheng 的输出作为 ABI 模板,不要自行假定跨版本调用约定。