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

Logo

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

更多推荐