延迟、吞吐率与流水线冲突¶
逐指令页面列出的周期来自 910B 架构周期模型,适合做静态排布和冲突分析,但不是芯片实测性能承诺。频率、内存命中、bank 分布、地址模式、固件和并发都会改变端到端时间。
执行域¶
| 域 | 典型路径 | 主要动态冲突 |
|---|---|---|
| Scalar/Flow | issue → Scalar EX/LSU → 固定延迟槽 → 写回/改 PC | X/SPR RAW/WAW、多周期 FPU、LSU、分支重定向 |
| Vector | issue → IBUF/uop → UB read → EXEU → UB/特殊写回 → retire | MASK/VA 依赖、uop 队列、UB bank/port、同 op 间隔 |
| Cube | issue → L0A/L0B read → MAC 迭代 → L0C write → retire | shape 展开、L0 端口、累加依赖、unit/control 状态 |
| MTE | issue → 地址/描述展开 → 路由队列 → 源读/目标写 → event | burst/stride、队列深度、源/目标端口、跨域 event |
| Fixpipe | L0C read → 转换/量化 → 目标写 | L0C 与 Cube 竞争、转换模式、目标端口 |
如何读周期表¶
L=...:固定执行/退休延迟;后续无依赖指令仍可能每拍发射。rd/ex/wr:Vector uop 的读、执行、基础写回段,不应简单相加后乘 repeat。- \(T=\max_i(\ldots)\):多个 uop 可以重叠,最终完成取决于最晚写回 uop。
issue_interval:无 hazard 时的模型发射条件,不等于设备 benchmark 的倒数吞吐率。dynamic_stalls:会把基础周期拉长的结构/数据冲突。
Vector 的典型完成式为:
\[
T=\max_{i}\!\left(t_{\mathrm{issue},i}+L_{\mathrm{rd},i}+L_{\mathrm{ex},i}+L_{\mathrm{wr,actual},i}\right)-t_{\mathrm{dispatch}}+1
\]
Lwr_actual 会被 UB bank/port 仲裁重新计算;repeat、block、MASK、stride 和跨 bank 地址决定 uop 数量。
关键 hazard¶
| hazard | 触发条件 | 排布方式 |
|---|---|---|
| RAW | 消费者读取尚未写回的 X/SPR/VA/MASK/存储数据 | 保持显式依赖;跨域使用 event/wait |
| WAW | 两条指令写同一目标,前者尚未到可提交点 | 不重用目标;必要时等待 |
| MASK | mask 更新尚未完成,后续 Vector 消费 MASK | 把 mask 设置放在消费序列前并保持依赖 |
| UB bank/port | 同拍 uop 访问同 bank 或超端口数 | 改地址/stride,错开读写,测量 bank 模式 |
| L0C | Cube 累加、Fixpipe 或搬出竞争 L0C | 用事件分阶段,避免同 tile 并发写/读 |
| 多周期 Scalar | f32、除法、s64 乘法等占用多周期单元 | 与独立域交错,避免紧邻依赖 |
| barrier/event | 等待的 event 未由正确源域产生 | 成对使用正确 src/dst 后缀和 event 槽 |
设备测量¶
硬件延迟和吞吐率必须在 910B 上分别测量:
- 单条依赖链测 latency;每条结果作为下一条输入。
- 多条独立指令流测 reciprocal throughput。
- 固定地址、MASK、repeat、shape 和 warm-up,单独改变一个因素。
- 分别测试无冲突与刻意 bank 冲突的地址。
- 记录编译器版本、目标 CPU、频率/电源状态和事件序列。
项目提供的 设备验证清单 保留结果栏;未填结果不能称为设备实测。