[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 (标量) 或 SIMTAXI突发128B / 256B / 512B对齐要求字节对齐 (DATA), 4B对齐 (指令)约束:向量核不能直接访问 GM— 必须通过 MTE2 DataCopy 到 UBAIC CUBE不能直接访问 GM— 必须通过 MTE2→L1→MTE1→L0A/L0BATOM/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→MTE22.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 的写优先于 MTE2L0B 转置通过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 和 addr256B × N → 同一 bank (冲突!) 地址 addr 和 addr128B × 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-associativeTAGVIVT写策略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 最大 128KB3. 数据搬运路径与延迟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 DSBDCCI │ │ 跨核跨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 边界异常L1写32 字节异常L0A写256 字节异常L0B写256 字节异常L0CFIXP读(F32/S32)64 字节异常L0CFIXP读(F16)32 字节异常UB读 (LDU)32 字节连续性能损失UB写32 字节异常UBbyte模式(R/W)字节对齐仅 UB↔OUTFIXP → OUT写字节对齐—FIXP → L1/UB写32 字节异常SSBUFR/W可 b64 或 b32(ldp/stp)—Stack128B128B (SIMT stack base)异常Parameter Bufpush_pb256-bit 宽—BiasBufMOV_L1_TO_BT32B源/64B目的异常6. 访问约束 Checklist6.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