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 统称数据物理所在
HAHome Agent,终结读请求;查 Directory + L2 Tag决定 L2 hit 还是 miss:hit→L2 Buffer 取数(快);miss→读 HBM 并 allocate(慢)
L2HA 维护的 L2 Cache,512B cacheline+128B sectorhit 时数据来自 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 需额外处理并 allocateDirectroy 命中率、共享度
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:用并发掩盖“单笔时延 = 固定 + 排队”的等待,把时延转成吞吐,避免队头阻塞暴露。

Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐