【AI】【昇腾】MTE2 读 GM(同地址)到 UB性能分析
·
MTE2 读 GM(同地址)到 UB 的通路、切分与时延估算
一句话:MTE2 负责把 GM 数据读进 UB;时延不是单一定值——它由“MTE 切分→SMMU→NoC→AA→HA→L2/HBM”的分项叠加决定,关键变量是 L2 hit 还是 HBM miss;同地址读取的顺序性不由 MTE 保证。
1. 通路总览(GM → UB)
MTE2 指令(LOAD OUT→UB/L1/L0)
→ CSHD 调度 → uop engine
→ BRIF 读接口(生成读请求 + 切分 BL1/BL2/BL4)
→ BIF → 下游总线
→ SMMU(VA→PA,AIC 标 ForceHome)
→ NoC(Multi-Ring 下行到 Home)
→ AA/DAC(译码 + 命中 DAW/MSD → 选 Home HA)
→ HA(查 Directory/L2 Tag:hit=从 L2 Buffer 取;miss=读 HBM 并 allocate 到 L2)
→ 数据返回(乱序)
→ BRIF ROB 排序(按 TAG ID in-order 链)→ 拼接 128B
→ MTE 写接口 → 写 UB
读路径:CSHD 调度 → uop → 总线读接口发请求到 SMMU → SMMU 乱序返回(时延非确定)→ 读接口把返回数据与写地址/控制打包 → 写接口写目标(UB)。
2. MTE2 读命令切分(Read command split rules)
- 128B domain:A/B/C/D 各 128B(512B 一组)。
- BL1=128B(不可跨 128B 边界)、BL2=256B(不可跨 256B 边界)、BL4=512B(不可跨 512B 边界)。
- 从起始地址所在 128B domain 到结束 domain,优先切最大的 BL,切完用剩余数据起点继续,直到结束。
- 效果:尽量用 BL4/512B 或 BL2/256B 减少命令数;头尾不足的被切小。
- 返回粒度:环总线带宽 32B,AA 把返回数据按 [128B]/[64B,64B]/[32B+…] 等格式拼接,32B 内部可能乱序。
3. 三条“通道/源”角色(GM / L2 / HA)
| 实体 | 角色 | 对读时延的影响 |
|---|---|---|
| GM(OUT) | 指令视角的外部内存 = HBM/DDR/L2 统称 | 数据物理所在 |
| HA | Home Agent,终结读请求;查 Directory + L2 Tag | 决定 L2 hit 还是 miss:hit→L2 Buffer 取数(快);miss→读 HBM 并 allocate(慢) |
| L2 | HA 维护的 L2 Cache,512B cacheline+128B sector | hit 时数据来自 L2,避免下 HBM |
| HBM3 | 最后物理存储 | miss 时下访,时延最大 |
hit/miss 分流:
- Shareable 读:HA 查 Standard Directory,命中→按 entry 提供一致性 + 数据;未命中→读 HBM 并创建 entry。
- Non-shareable:HA 透传,不查 Directory;同地址多个 local non-shareable 操作用软件保证顺序。
- L2 prefetch:可提前把 DDR/HBM 数据预取进 L2 提高 hit 率;只发读命令、bus 不返回 rdata;有独立 L2 prefetch stop 指令,AIC/AIV 各自独立。
4. 同地址读取问题
- MTE 内部无同地址冲突检查:RAW/WAW/WAR 靠软件 Barrier + WFE。
- 多读同一地址:多个读请求命中同一地址是安全的(读不改变数据);但返回乱序,MTE 用 ROB + TAG ID 同 port_id&cmd_id 组成 in-order 链恢复顺序,AA 完成 128B 拼接后才回 MTE。
- 危险场景是“读与写交错同一地址”(如一个 MTE2 读 + 另一个 MTE3/SU 写同一 GM 地址,或 AIC 与 AIV 并发):硬件无任何保证,必须软件 Barrier保证先写完成(retired)再读,否则读到旧值。
- 跨 master(AIC/AIV/FIXP 的 AW/AR)不同队列无顺序保证,靠 STARS/AICPU 调度依赖 + 同步原语。
- 工程建议:同地址反复小粒度读写会带来 RMW/带宽浪费;尽量 128B 对齐、合并访问;同地址写读依赖显式同步。
5. 如何估算 GM → UB 时延
时延是分项(流水线 + 并发)叠加,不是单一定值。建议按“确定项 + 可变项”建模:
T_GM→UB ≈ T_mte_issue 固定流水(CSHD→uop→BRIF 发出请求,数~几十 cycle 内)
+ T_smmu 地址翻译(VA→PA, ForceHome)
+ T_noc_down 下行 NoC 跳到 Home(每跳 ~1 cycle,多 Ring)
+ T_aa AA 译码/交织
+ T_ha_query HA 目录/L2 Tag 查询
+ T_mem ←【可变·关键】
L2 hit : T_L2 ≈ 15 cycle
HBM miss: T_HBM Idle ~65 ns(row miss 64B);满负载 ~320 ns(90%BW)
+ T_noc_up 上行返回到 MTE
+ T_reorder+concat 32B/64B→128B 拼接 + ROB 排序
+ T_write_ub MTE 写 UB
(实际因 128B 拆 4×32B、乱序返回、outstanding 数与带宽利用率叠加为吞吐时延)
5.1 估算(存在误差)
| 参数 | 值 |
|---|---|
| L2(单) Read Latency | ~15 cycle |
| L2(单) Write Latency | ~6 cycle |
| HBM3 Idle Latency | ~65 ns(row miss, 64B) |
| HBM3 Load Latency | ~320 ns(1:1 90% BW 满负载) |
5.2 量级估算(直觉)
- L2 hit:整条通路典型在**~100 ns 级**(流水 ~30-60 ns + L2 ~7 ns + 返回/拼接)。
- HBM miss(idle):~200–400 ns 量级(流水 + 65 ns HBM + 返回)。
- HBM miss(满带宽):受 128B/4×32B 拆分、outstanding(读 512B)与带宽利用率限制,实际均摊时延增大,320 ns 以上。
- 因此提升 L2 hit 率(L2 prefetch)+ 尽量 512B/256B 对齐突发(少切分)+ 充足 outstanding 是降时延。
5.3 估算公式(工程用)
单块 128B 读均值时延 ≈ Tfix(流水/SMMU/NoC/AA/HA/返回/写UB)
+ (1-hit_rate)·T_HBM_miss + hit_rate·T_L2
+ T_split_penalty(未对齐/小块导致的额外命令数)
+ T_throughput(受 outstanding 与带宽: N_out put ≥ 需并发掩盖时延)
- 头尾未满 128B → 拆 BL1 → 命令数变多、拼接开销增大 → 尽量整块对齐。
- 吞吐视角:需并发 outstanding 掩盖单笔时延(outstanding × 每命令带宽 ≥ 所需带宽),否则时延直接暴露。
5.4 阶段耗时拆解
| 阶段 | 耗时原因 | 关键约束 |
|---|---|---|
| MTE 指令调度/issue | 同队列in-order issue:队列头指令的读写接口被占用则整队 stall;需先做译码/依赖检查、CSHD 为每条指令分配接口与 uop;FUSE/Early start 只在类型相同/提前满足时才省时 | 指令队列深度、uop 数量、接口占用 |
| uop 生成/BRIF 发请求 | 一个 DMA 指令拆成多个 burst(uop),小块/未对齐 → uop 数变多;AW/AR 通道多源(AIC/AIV/FIXP) round-robin 仲裁,抢不到接口就排队 | burst 数 = 切分数 |
| SMMU 地址翻译 | VA→PA 需查多级页表(TLB);TLB miss 时走内存 walk 开销最大;若开虚拟化还要 stage1+stage2 两级翻译;还要打 ForceHome/属性位;SMMU 内部有队列与仲裁 | TLB 命中率、页表层级 |
| NoC 下行(Ring 多跳) | 逐跳传输每跳约 1 cycle;跨 die/远端 Home 跳数更多(SIO 更长);遇到拥塞/流控(Itag 占位、背压、QoS 仲裁)会插入等待 cycle | 跳数、拥塞、跨 die |
| AA/DAC 译码 + 交织 | 需查 DAW/MSD 窗口做目标选择、算交织(选出目标 cluster/subUC 的 HA);未对齐/小块会多拆命令;MPAM/QoS 优先级仲裁也在此 | 窗口命中、交织粒度 |
| HA 目录/L2 Tag 查询 | Sparse Directory + L2 Tag 检查要消耗若干 cycle;Shareable 读还要做一致性处理/可能的 snoop;directory miss 需额外处理并 allocate | Directroy 命中率、共享度 |
| L2 取数(hit) | L2 为 SRAM,读需bank 访问 + 1024bit 数据线,每 bank 每 cycle 请求数有限;128B sector/15 cycle 是固定bank/阵列时延 | SRAM 时延、bank 仲裁 |
| HBM 读(miss) | 物理原因最多:row activate(row miss)、列选 CAS、bank 冲突/页策略(close/open/adaptive)、刷新(ABR/PBR)、上下电(Idle PD);~70ns 是 row miss 理想值;满带宽 320ns 主要来自**排队等待(HBM 带宽被占满)**与利用率 | Precharge/Activate、带宽利用率、bank 冲突 |
| NoC 上行返回 | 与下行相同:反向多跳 + 流控/背压;且返回是乱序的,受拥塞影响更大 | 跳数、乱序度 |
| ROB 排序 + 拼接 128B | 总线乱序返回,MTE 必须等齐一个 128B 的 4×32B 才能按 in-order 链(同 port_id&cmd_id)恢复顺序后拼接;受“最慢那一段”拖累(队头效应);AA 只能按 [32B]/[64B]/[128B] 有限格式拼接 | 各 32B 返回时间差、队头阻塞 |
| 写 UB | 写接口按 256B 位宽/32B 粒度写入 UB,需避 bank 冲突,写带宽与 RMW(小粒度带 ECC)会增加额外开销 | UB bank、粒度 |
为什么“非确定/不是定值”:总线返回本就有时延抖动,叠加上述各阶段的排队等待与仲裁竞争,且 MTE 无同地址冲突检查、靠软件同步——所以单笔时延是“固定流水 + 并发排队”的随机和,只能按分项+带宽利用率估算均摊值,无法给唯一确定数。
降低时延的物理本质
- 提 L2 hit 率:把“慢的 HBM(~320ns)”换成“快的 L2”,直接砍掉最大可变项。
- 512B/256B 整块对齐:减少 BL1 切分数与 uop 数 → 少排队、少拼接开销。
- 充足 outstanding:用并发掩盖“单笔时延 = 固定 + 排队”的等待,把时延转成吞吐,避免队头阻塞暴露。
更多推荐


所有评论(0)