[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配置)
读HintNormal(first/last victim, persistent), Not-alloc(keep/clean/drop)
写HintNormal, 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 MTE1RL1 → L0A/L0B (2D/3D Load)
AIC MTE2R/WGM ↔ L1 (DMA/SET_2D/ND2NZ)
AIC FIXPWL0C → L1 (写回CUBE结果)
AIV MTE2WGM → 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 矩阵缓冲)

参数L0AL0B
容量64 KB64 KB
写对齐256 B256 B
仲裁MTE1 优先于 MTE2MTE1 优先于 MTE2
用途矩阵A (输入/特征)矩阵B (权重)
数据格式Fractal (m×k), Zz或NzFractal (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)
Cacheline128 B
关联度4-way set-associative
TAGVIVT
写策略Write-through (GM store), Write-back (stack store)
未命中重排序 FIFO200 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 写入规则 (谁能写什么)

可写入目标引擎/指令
GML1MTE2 (DMA/ND2NZ/DN2NZ/SET_L1_2D)
GMUBMTE2 (DMA/AIV), ND-DMA (AIV)
GML0AMTE2→L1→MTE1 (两步)
GML0BMTE2→L1→MTE1 (两步)
L1L0AMTE1 (2D/3D Load)
L1L0BMTE1 (2D/3D Load/Transpose)
L1UBMTE (DMA MOV)
L1BiasBufMTE1 (MOV_L1_TO_BT)
L1FixPBufMTE/FIXP (MOV_FB)
L0CL1FIXP (L0C→L1)
L0CUBFIXP (L0C→UB, dual source)
L0COUT/GMFIXP (L0C→OUT, 经 MTE3→GM)
UBGMMTE3 (DMA)
UBL1MTE (DMA MOV)
UBVREGVEC LDU (VLD/VLDS/VLDI)
VREGUBVEC STU (VST/VSTS/VSTI)
GMVREG不可直接 (必须经 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)b1616-bit 边界异常
GM (SU LD/ST)b3232-bit 边界异常
GM (SU LD/ST)b6464-bit 边界异常
L132 字节异常
L0A256 字节异常
L0B256 字节异常
L0CFIXP读(F32/S32)64 字节异常
L0CFIXP读(F16)32 字节异常
UB读 (LDU)32 字节连续性能损失
UB32 字节异常
UBbyte模式(R/W)字节对齐仅 UB↔OUT
FIXP → OUT字节对齐
FIXP → L1/UB32 字节异常
SSBUFR/W可 b64 或 b32(ldp/stp)
Stack128B128B (SIMT stack base)异常
Parameter Bufpush_pb256-bit 宽
BiasBufMOV_L1_TO_BT32B源/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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值