[AI][昇腾950] Cache 体系总结与注意事项
·
Cache 体系总结与注意事项
1. Cache 全景图
昇腾950 分成如下部分Cache, 即:
- 1, 核间Cache, 即 L2Cache
- 2, 核内Cache
- 2.1 指令Cache, 即: I-Cache
- 2.2 栈空间Cache, 服务于Scalar单元访问GM 的Cache, 即: D-Cache
- 2.3 ND-DMA Cache, 服务于ND-DMA, 即 NDDMA-Cache
- 2.4 SIMT-VF 或者 SIMD-VF 的 指令Cache, 即: VF I-Cache
┌─────────────────────────────────────────────────────────────────────────────┐
│ AI Core Cache 体系 │
│ │
│ ┌─────────────────────────────────────────────────────────────────────┐ │
│ │ L2 Cache (系统级共享) │ │
│ │ 容量: MB级 所有 Core 共享 │ │
│ │ 位置: 单板, MTE2/MTE3/SU LD/ST 的中间缓冲 │ │
│ │ Hint: first/last victim, persistent, not-alloc, drop, ... │ │
│ └───────────────────────────┬─────────────────────────────────────────┘ │
│ │ │
│ ┌───────────────┼───────────────┐ │
│ ▼ ▼ ▼ │
│ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ │
│ │ AIC (Cube) │ │ AIV0 (Vec) │ │ AIV1 (Vec) │ │
│ │ │ │ │ │ │ │
│ │ ┌─────────────┐ │ │ ┌─────────────┐ │ │ ┌─────────────┐ │ │
│ │ │SU0 I-Cache │ │ │ │SU1 I-Cache │ │ │ │SU2 I-Cache │ │ │
│ │ │ 32KB │ │ │ │ 16KB │ │ │ │ 16KB │ │ │
│ │ │ Line=128B │ │ │ │ Line=128B │ │ │ │ Line=128B │ │ │
│ │ └─────────────┘ │ │ └─────────────┘ │ │ └─────────────┘ │ │
│ │ ┌─────────────┐ │ │ ┌─────────────┐ │ │ ┌─────────────┐ │ │
│ │ │SU0 D-Cache │ │ │ │SU1 D-Cache │ │ │ │SU2 D-Cache │ │ │
│ │ │ 32KB │ │ │ │ 32KB │ │ │ │ 32KB │ │ │
│ │ │ Line=64B │ │ │ │ Line=64B │ │ │ │ Line=64B │ │ │
│ │ └─────────────┘ │ │ └─────────────┘ │ │ └─────────────┘ │ │
│ │ │ │ ┌─────────────┐ │ │ ┌─────────────┐ │ │
│ │ │ │ │ VF I-Cache │ │ │ │ VF I-Cache │ │ │
│ │ │ │ │ 8KB 2-way │ │ │ │ 8KB 2-way │ │ │
│ │ │ │ │ Line=128B │ │ │ │ Line=128B │ │ │
│ │ │ │ └─────────────┘ │ │ └─────────────┘ │ │
│ │ │ │ ┌─────────────┐ │ │ ┌─────────────┐ │ │
│ │ │ │ │SIMT DCache │ │ │ │SIMT DCache │ │ │
│ │ │ │ │32-128KB │ │ │ │32-128KB │ │ │
│ │ │ │ │Line=128B │ │ │ │Line=128B │ │ │
│ │ │ │ └─────────────┘ │ │ └─────────────┘ │ │
│ │ │ │ ┌─────────────────────────────────┐ │ │
│ │ │ │ │ NDDMA Cache │ │ │
│ │ │ │ │ 8 KB │ │ │
│ │ │ │ │ Line=128B │ │ │
│ │ │ │ └─────────────────────────────────┘ │ │
│ └─────────────────┘ └─────────────────┘ └─────────────────┘ │
│ │
└────────────────────────────────────────────────────────────────────────────┘
2. 各级 Cache 详细规格
I-Cache 特性:
- Kickstart 时可选 I-Cache invalidation + preload
- 预加载 (preload): 从指定地址预取指定数量的 cache line 到 I-Cache
- I-Cache miss 时: 硬件自动通过 BIU → L2 → DDR 取指
- 不需要软件维护一致性 (指令不会被运行时修改)
D-Cache 特性:
- Write-back 模式: Stack 区域的写先暂存在 D-Cache, 换出时写回; 故存在一致性问题
- D-Cache 可被 DCCI 指令无效化 (invalidate), 会把dirty 写入到GM
VF I-Cache 特性:
- Peek FIFO: 可预取最多 4 个后续 VF (可配置 1-4)
- Cache TAG 包含 prefetcher ID: 替换算法逐出 “离当前 VF 最远” 的 line
- VF 大小在 push_VF 时传入 → 预取器知道何时停止
- 单个 VF 可大于 I-Cache (950 允许, 靠 miss 补偿)
- 内层循环 < 24 条指令时缓存在 IB (Instruction Buffer), 零开销
SIMT D-Cache 特性:
- 与 UB 动态分区:
ub_sz参数决定 UB 占用, DCache 使用剩余空间 - 最小
ub_sz= 128KB → DCache 最大 128KB;ub_sz= 256KB → DCache = 0 - 64 地址 coalescing: 同一 warp 内 32 个线程的连续地址合并为 1-4 个 cache line 请求
- Task 结束时: dirty lines 自动 write-back + drop (DCache 全部失效)
NDDMA Cache 特性:
- 两个AIV 操作的时候1个ND-DMA Cache, 故AIV0 调用DCI-NDDMA 会清理掉 AIV1 缓存的数据。
L2 Cache 不直接可见 — 软件只能通过 CTRL 寄存器的 Hint 控制策略:
- persistent 占满 L2 其他数据无法缓存, 建议 persistent ≤ L2 50%, 用完 Drop
| Hint | 值 | 含义 | |
|---|---|---|---|
| LD (读) | 0000 | Normal, first victim (默认, 最先被逐出) | |
| 0001 | Normal, last victim (最后被逐出) | ||
| 0010 | Persistent (常驻, 不被逐出) | ||
| 0100 | Not-alloc, keep (不分配新 line, 保留已有) | ||
| 0101 | Clean (写回但不逐出) | ||
| 0110 | Drop (丢弃 cache line, 释放空间) | ||
| ST (写) | 0000 | Normal, first victim (write-back) | |
| 0100 | Not-alloc, clean-invalid (不缓存, 直接写 GM) | ||
| 1100 | Write-through-share (写穿透 + 共享, 多核立即可见) |
3. Cache 一致性模型
3.1 ATOM/RED 与 Cache 的冲突
ATOM/RED 原子操作: Scalar 直接访问 GM, 旁路 D-Cache
3.2 D-Cache 与 MTE 的一致性
SU D-Cache: 缓存 SU LD/ST 的 GM 数据
MTE2/MTE3: 经过 L2 Cache 搬运 GM ↔ UB/L1
冲突场景:
SU 用 LD 读取 GM 地址 X → 数据缓存在 D-Cache
MTE2 从 GM 地址 X 搬运到 UB → 经过 L2, 可能命中 L2 旧数据
修复:
SU D-Cache 是 write-through → SU 的写已经到 L2
但 SU 的读可能在 D-Cache 中残留旧值
→ SU 在 MTE2 写入后读取同一地址前: DCCI (D-Cache invalidate)
4. Cache 控制指令
| API | 等价指令 | 说明 |
|---|---|---|
DataCachePreload(addr, numLines) |
DC_PRELOADI |
L2 预取 |
DataCacheInvalid(addr) |
DCCI Xn, #0 |
单行无效化 |
DataCacheInvalidAll() |
DCCI Xn, #1, ALL |
全部无效化 |
DataCacheInvalidOut() |
DCCI Xn, #1, OUT |
OUT 分区无效化 |
DataCacheInvalidAtomic() |
DCCI Xn, #1, ATOMIC |
ATOMIC 分区无效化 |
DataCacheInvalidNoWriteback() |
DCI |
无写回无效化 (3510) |
PipeBarrier<PIPE_XXX>() |
SMEM_BAR |
UB 内存屏障 |
5. L2 Cache 优化策略
5.1 读路径优化 (MTE2: GM → L2 → L1/UB)
┌─────────────────────────────────────────────────────────────┐
│ 场景 │ LD Hint [19:16] │ 原因 │
├─────────────────────────┼────────────────┼───────────────┤
│ GEMM 权重 (跨 Tile 复用) │ 0010 persistent │ 常驻 L2 │
│ GEMM 输入 (单次读取) │ 0001 last-victim│ 读完即弃 │
│ 临时 buffer (只用一次) │ 0000 first-victim│ 优先让出 │
│ 已缓存数据二次读取 │ 0100 not-alloc │ 不再分配新 line │
│ 不再需要的数据 │ 0110 drop │ 主动释放 L2 空间│
└─────────────────────────────────────────────────────────────┘
5.2 写路径优化 (MTE3: UB/L1 → L2 → GM)
┌─────────────────────────────────────────────────────────────┐
│ 场景 │ ST Hint [23:20] │ 原因 │
├─────────────────────────┼────────────────┼───────────────┤
│ 中间结果 (后续读回) │ 0000 normal │ write-back 缓存 │
│ 最终输出 (不再读回) │ 0100 not-alloc │ 不占 L2 空间 │
│ 跨核可见的写入 │ 1100 wt-share │ 写穿透+立即可见 │
└─────────────────────────────────────────────────────────────┘
更多推荐



所有评论(0)