[AI][昇腾950] 内存层级与访问约束
·
DaVinci 950 内存层级与访问约束
1. 内存层级全景图
硬件专用缓冲 (软件不可直接寻址, 通过专用指令/引擎访问):
┌─────────┐ 512KB MTE引擎管理 ← AIC: MTE1(L1→L0), MTE2(GM↔L1)
│ L1 │ ← FIXP: L0C→L1( or GM) 写回
│ (Cube) │ R:512B W:256B / cyc ← 格式: NC1HWC0 (Nz/Zz)
│ │
└─────────┘
┌─────────┐ 64KB ← MTE1 写入 (2D/3D Load)
│ L0A │ 256B 写对齐 ← CUBE MMAD 读取 (矩阵A)
│ (Cube) │ ← 数据格式: Zz/Nz, fractal矩阵
└─────────┘
┌─────────┐ 64KB ← MTE1 写入 (2D/3D Load)
│ L0B │ 256B 写对齐 ← CUBE MMAD 读取 (矩阵B)
│ (Cube) │ ← 可存储权重/转置矩阵
└─────────┘
┌─────────┐ 256KB ← CUBE MMAD 写入 (累加结果)
│ L0C │ 1024B R + 1024B W ← FIXP 读取 → L1/UB/OUT
│ (Cube) │ ← 存储格式: FP32/S32 fractal矩阵
└─────────┘
┌─────────┐ 4KB ← MOV_L1_TO_BT 加载
│ BiasBuf │ 1024×4B ← MMAD 时自动 fetch 做偏置加法
│ (Cube) │ FP16/FP32/BF16 ← 必须从L1加载
└─────────┘
┌─────────┐ 6KB ← MOV_FB 从L1加载
│ FixPBuf │ Bias:4K + RELU:2K ← DEQ/RELU/量化参数
│ (FIXP) │ QuantPre:4K ← 必须从L1加载
└─────────┘
┌─────────┐ 256KB MTE引擎管理 ← 128B cacheline
│ UB │ ← AIV: MTE2(GM↔UB), MTE3(UB→GM)
│ (AIV) │ 32-128KB SIMT DCache ← SIMT模式 LDG/STG 访问
│ │ R:512B W:256B / cyc
└─────────┘ UB 与 SIMT-DCache 可动态分区 ← 64地址coalescing
┌─────────┐ 128KB AIV MTE管理 ← ND-DMA 数据搬运专用缓存
│NDDMA DC │ 128B cacheline ← direct-mapped, 32 banks
│ (AIV) │ 不与主L2共享 ← LDG/STG 可选择经过
└─────────┘
┌─────────┐ 每Core 1KB Scalar管理
│SSBUF │ 4B/8B
│ │
└─────────┘
2. 各级存储详细规格
2.1 GM (Global Memory / DDR / HBM)
| 参数 | 值 |
|---|---|
| 地址宽度 | 48-bit VA |
| 访问方式 | 仅通过 MTE2/MTE3 (数据) 或 SU LD/ST (标量) 或 SIMT |
| AXI突发 | 128B / 256B / 512B |
| 对齐要求 | 字节对齐 (DATA), 4B对齐 (指令) |
约束:
- 向量核 不能直接访问 GM — 必须通过 MTE2 DataCopy 到 UB
- AIC CUBE 不能直接访问 GM — 必须通过 MTE2→L1→MTE1→L0A/L0B
- ATOM/RED 原子操作直接到 GM (旁路L2)
2.2 L2 Cache (System Level)
| 参数 | 值 |
|---|---|
| 位置 | 片上系统级, 所有AI Core共享 |
| 容量 | MB级 (具体由SoC配置) |
| 读Hint | Normal(first/last victim, persistent), Not-alloc(keep/clean/drop) |
| 写Hint | Normal, Not-alloc(clean-invalid) |
访问路径:
MTE2读: GM → L2 Cache → MTE2 Engine → UB/L1
MTE2写: UB/L1 → MTE3 Engine → L2 Cache → GM
SU LD/ST: GM → L2 Cache → SU DCache → X寄存器
约束:
- L2 对软件不透明 — 只能通过 CTRL Hint 控制策略
- ATOM/RED 操作 旁路 L2 — 与 MTE2/MTE3 可能产生一致性冲突
- 跨核数据交换: 写端必须 DSB→DCCI→通知; 读端必须 等待→DCCI→MTE2
2.3 L1 (Cube Local)
| 参数 | 值 |
|---|---|
| 容量 | 512 KB |
| 读带宽 | 512 B/cycle |
| 写带宽 | 256 B/cycle |
| 写对齐 | 32 字节 |
| 读端口 | 1 (MTE1 pipe) |
| 写端口 | 2 (共享: UB/MTE2/FIXP) |
| 数据格式 | NC1HWC0 (Zz/Nz格式, fractal矩阵) |
访问者:
| 访问者 | 操作 | 路径 |
|---|---|---|
| AIC MTE1 | R | L1 → L0A/L0B (2D/3D Load) |
| AIC MTE2 | R/W | GM ↔ L1 (DMA/SET_2D/ND2NZ) |
| AIC FIXP | W | L0C → L1 (写回CUBE结果) |
| AIV MTE2 | W | GM → L1 (部分DMA路径) |
| AIC CUBE | — | 不直接访问 (通过MTE1搬运到L0A/L0B) |
约束:
- L1 的 R/W 在 同bank group不同bank 或 不同bank group 时可并行
- 写优先级: UB/MTE2/FIXP (round-robin) > L1读
- 数据必须以 NC1HWC0 格式存储 (由 MTE2 ND2NZ/DN2NZ 转换)
2.4 L0A / L0B (Cube 矩阵缓冲)
| 参数 | L0A | L0B |
|---|---|---|
| 容量 | 64 KB | 64 KB |
| 写对齐 | 256 B | 256 B |
| 仲裁 | MTE1 优先于 MTE2 | MTE1 优先于 MTE2 |
| 用途 | 矩阵A (输入/特征) | 矩阵B (权重) |
| 数据格式 | Fractal (m×k), Zz或Nz | Fractal (k×n), 支持转置 |
访问路径:
唯一写入路径: MTE1
L1 → MTE1 → L0A (2D Load / 3D Load img2col)
L1 → MTE1 → L0B (2D Load / 2D Transpose / 3D Load)
唯一读取路径: CUBE FSM
L0A → BUFA → PE Slice (乘法输入A)
L0B → BUFB → PE Slice (乘法输入B)
约束:
- CUBE 不能直接读 L0A/L0B — 只能由 MTE1 写入, CUBE FSM 内部读取
- MTE1 对 L0A 的写优先于 MTE2
- L0B 转置通过
LOAD_L1_TO_L0B_2D_TRANSPOSE指令实现 - L0A 的 Nz 格式 (950): fractal 按列主序存储 (与 昇腾910B/C 的 Zz 不同)
2.5 L0C (Cube 结果缓冲)
| 参数 | 值 |
|---|---|
| 容量 | 256 KB |
| 读带宽 | 1024 B/cycle |
| 写带宽 | 1024 B/cycle |
| 数据格式 | Fractal矩阵, FP32/S32 累加结果 |
| 最小单元 | 1 fractal (512B for FP16, 等) |
访问路径:
唯一写入: CUBE MMAD
PE Slice 累加 → L0C RAM
唯一读取: FIXP
L0C → FIXP_PRE (DEQ/RELU) → MEM_WIF (NZ2ND/Channel Merge) → L1/UB/OUT
约束:
- CUBE 和 FIXP 不能同时访问同一 L0C 区域 — 由 Hardware WAIT-SET 仲裁
- FIXP 读 L0C 的并行度取决于数据类型
2.6 UB (Unified Buffer / Vector Local)
| 参数 | 值 |
|---|---|
| 容量 | 256 KB (与 SIMT DCache 动态分区) |
| 总带宽 | 512 B (128B R + 128B W 共享) |
| 写对齐 | 32 字节 |
| 读对齐 | 32字节连续 (LDU) |
Bank冲突规则:
950 严重约束: 仅 2 bank/group
地址 addr 和 addr+256B × N → 同一 bank (冲突!)
地址 addr 和 addr+128B × N → 不同 bank (可并行)
例: 两个 LD 同时访问 [0x0000] 和 [0x0100] → 同bank → 串行
两个 LD 同时访问 [0x0000] 和 [0x0080] → 不同bank → 并行
数据前递 :
写后立即读同一地址:
周期1: Write block 0
周期2: Read blocks 0-3 → block 0 从写管道前递, blocks 1-3 从RAM
→ 始终返回最新写入的数据
→ 写后读不需额外等待 (UB内部处理)
约束:
- 弱内存排序: UB 访问可 OOO 执行 → 需要
SMEM_BAR保证依赖 - Masked write: UB 内部 read-modify-write, 非阻塞
- 950 read crossbar 从全交叉降级为 rotator → 非连续读性能下降
2.7 SSBUF (Scalar Share Buffer)
| 参数 | 值 |
|---|---|
| 容量 | 3 KB |
| 分配 | AIC: [0, 1KB), AIV0: [1KB, 2KB), AIV1: [2KB, 3KB) |
| 地址 | 0x040000 – 0x04C00 |
| 访问 | ld/st b64 或 ldp/stp b32 |
| 属性 | Non-cacheable, 保序 issue + commit |
用途: AIC 与 AIV 之间的轻量级数据交换 (无需 MTE DMA)
2.8 DCache (SIMT 模式专用)
| 参数 | 值 |
|---|---|
| 容量 | 32-128 KB (与 UB 动态分区, 粒度 32KB) |
| Cacheline | 128 B |
| 关联度 | 4-way set-associative |
| TAG | VIVT |
| 写策略 | Write-through (GM store), Write-back (stack store) |
| 未命中重排序 FIFO | 200 entries |
| 地址合并 | 4 banks × 32 addresses |
与 UB 的关系:
UB 256KB 固定分区:
SIMT模式: ub_sz 参数决定 UB 占用
DCache = UB 中 ub_sz 之外的空间 (或专用 SRAM)
最小 ub_sz = 128KB → DCache 最大 128KB
3. 数据搬运路径与延迟
3.1 AIC 数据路径
完整 GEMM 数据流
延迟 (cycle)
┌─────┐
│ GM │ ──── MTE2 (DMA, 128-256B/cyc) ────► L1 ~50-100 (DDR miss)
│ │ ↑ ~5-10 (L2 hit)
│ │ │
│ │ ◄─── MTE3 (DMA, 128B/cyc) ◄── FIXP ◄── L0C ~4-8 (FIXP延迟)
└─────┘
│
▼
┌─────┐ MTE1 (2D/3D Load)
│ L1 │ ────► L0A (256B/cyc write) ~3-5 (L1 read)
│ │ ────► L0B (256B/cyc write) ~3-5 (L1 read)
└─────┘
│
▼
┌─────┐ CUBE MMAD
│L0A/B│ ────► PE Slice (MAC) ────► L0C 24 (完整管线)
│ │ 1 fractal/cyc throughput
└─────┘
│
▼
┌─────┐ FIXP
│ L0C │ ────► DEQ/RELU/NZ2ND ────► L1/UB/OUT ~2-4 (FIXP延迟)
└─────┘
3.2 AIV 数据路径 (SIMD 模式)
┌─────┐
│ GM │ ──── MTE2 (DMA, 128B/cyc) ────► UB ~50-100 (DDR miss)
│ │ ↑ ~5-10 (L2 hit)
│ │ ◄─── MTE3 (DMA, 128B/cyc) ◄── UB ~50-100 (DDR写)
└─────┘
│
▼
┌─────┐ LDU (2 instr/cyc, 128B)
│ UB │ ────► VREG (64/128B write) ~3-5 (UB hit + RF写)
│ │ ◄──── STU (1 instr/cyc, 128B) ◄── VREG ~1 (RF读 + UB写)
│ │
│ │ ←── GSU (scatter, 共享STU端口, 高优先) ~2-3
└─────┘
│
▼
┌─────┐ VALU (2套, 双发射)
│VREG │ ────► VALU/SFU/VSLIDE ────► VREG 2-4 (算术延迟)
│(74ph)│ 32 FP16/cyc × 2 = 256 FP16/cyc
└─────┘
3.3 AIV 数据路径 (SIMT 模式)
┌─────┐
│ GM │ ──── LDG (经 DCache) ────► Register File ~8 (DC hit)
│ │ ~256 (L2 miss)
│ │ ~480 (DDR miss)
│ │ ◄─── STG (write-through) ◄── Register File
└─────┘
│
▼
┌─────┐ LDS/STS
│ UB │ ────► Register File (shared mem access) ~2-3 (直接命中)
│(部分)│ ◄──── Register File
└─────┘
│
▼
┌─────┐ Stack (LDK/STK)
│Stack│ ────► Register File (thread-local)
└─────┘
4. 跨缓冲区数据流约束
4.1 写入规则 (谁能写什么)
| 源 | 可写入目标 | 引擎/指令 |
|---|---|---|
| GM | L1 | MTE2 (DMA/ND2NZ/DN2NZ/SET_L1_2D) |
| GM | UB | MTE2 (DMA/AIV), ND-DMA (AIV) |
| GM | L0A | MTE2→L1→MTE1 (两步) |
| GM | L0B | MTE2→L1→MTE1 (两步) |
| L1 | L0A | MTE1 (2D/3D Load) |
| L1 | L0B | MTE1 (2D/3D Load/Transpose) |
| L1 | UB | MTE (DMA MOV) |
| L1 | BiasBuf | MTE1 (MOV_L1_TO_BT) |
| L1 | FixPBuf | MTE/FIXP (MOV_FB) |
| L0C | L1 | FIXP (L0C→L1) |
| L0C | UB | FIXP (L0C→UB, dual source) |
| L0C | OUT/GM | FIXP (L0C→OUT, 经 MTE3→GM) |
| UB | GM | MTE3 (DMA) |
| UB | L1 | MTE (DMA MOV) |
| UB | VREG | VEC LDU (VLD/VLDS/VLDI) |
| VREG | UB | VEC STU (VST/VSTS/VSTI) |
| GM | VREG | 不可直接 (必须经 UB) |
4.2 管线间数据一致性模型
┌──────────────────────────────────────────────────────────────┐
│ 一致性保证等级 │
│ │
│ 同一管线内: 无硬件检查 → 需要 SMEM_BAR/bar.pipe │
│ 同核跨管线: SET_FLAG/WAIT_FLAG 同步, Get_BufID/Rel_BufID │
│ 跨核同Wrap: SET_CROSS_CORE / WAIT_FLAG_DEV + DSB+DCCI │
│ 跨核跨Wrap: HWTS cross-core sync (mode 0-3) │
│ 跨Die: HWTS group sync + HSCB │
│ │
│ 弱排序: UB 访问可 OOO → 依赖需显式 barrier │
│ ATOM旁路L2: 原子操作绕过L2 → 与 MTE2/MTE3 冲突 │
└──────────────────────────────────────────────────────────────┘
5. 对齐约束汇总
| 缓冲 | 操作 | 对齐要求 | 违反后果 |
|---|---|---|---|
| GM (SU LD/ST) | b16 | 16-bit 边界 | 异常 |
| GM (SU LD/ST) | b32 | 32-bit 边界 | 异常 |
| GM (SU LD/ST) | b64 | 64-bit 边界 | 异常 |
| L1 | 写 | 32 字节 | 异常 |
| L0A | 写 | 256 字节 | 异常 |
| L0B | 写 | 256 字节 | 异常 |
| L0C | FIXP读(F32/S32) | 64 字节 | 异常 |
| L0C | FIXP读(F16) | 32 字节 | 异常 |
| UB | 读 (LDU) | 32 字节连续 | 性能损失 |
| UB | 写 | 32 字节 | 异常 |
| UB | byte模式(R/W) | 字节对齐 | 仅 UB↔OUT |
| FIXP → OUT | 写 | 字节对齐 | — |
| FIXP → L1/UB | 写 | 32 字节 | 异常 |
| SSBUF | R/W | 可 b64 或 b32(ldp/stp) | — |
| Stack | 128B | 128B (SIMT stack base) | 异常 |
| Parameter Buf | push_pb | 256-bit 宽 | — |
| BiasBuf | MOV_L1_TO_BT | 32B源/64B目的 | 异常 |
6. 访问约束 Checklist
6.1 Cube 数据流完整约束
✓ MTE2 加载输入: GM → L1 (NC1HWC0格式)
✓ MTE1 加载特征: L1 → L0A (2D/3D Load, 地址256B对齐)
✓ MTE1 加载权重: L1 → L0B (2D Load, 可转置)
✓ CUBE MMAD: L0A × L0B → L0C
✓ FIXP: L0C → DEQ/RELU → NZ2ND → OUT (128B/cyc)
7.2 SIMD Vector 数据流约束
✓ MTE2: GM → UB (数据预取, CTRL LD hint 选择策略)
✓ DSB / PipeBarrier (如果 GM→UB 前有同地址写)
✓ VF 启动: 数据已在 UB
✓ VLD/VLDS: UB → VREG (目标寄存器奇偶交替, 地址32B对齐)
✓ SMEM_BAR (如果 LD 与前序 ST 可能 UB 同地址冲突)
✓ VALU: VREG → VREG (寄存器奇偶均分, 双发射)
✓ VST/VSTS: VREG → UB (STU 每周期仅1条)
✓ SMEM_BAR (如果后续 LD 与 ST 同地址)
✓ MTE3: UB → GM (CTRL ST hint 选择策略)
7.3 SIMT Vector 数据流约束
✓ ub_sz 配置: task kickstart 时确定 UB/DCache 分区
✓ LDG: GM → DCache → Register (连续地址对warp内coalesce)
✓ LDS: UB → Register (shared memory, 无TAG查找)
✓ MEMBAR (同一线程的内存序保证)
✓ bar.thread_block (线程块内所有warp同步)
✓ STG: Register → GM (write-through, 每条store可见)
✓ DCI (DCache invalidate, MTE修改了GM后必须执行)
✓ task 结束: DCache dirty lines 自动 write-back + drop
更多推荐


所有评论(0)