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   │ 写穿透+立即可见 │
└─────────────────────────────────────────────────────────────┘
Logo

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

更多推荐