news 2026/6/25 14:36:43

[AI][昇腾950] 内存层级与访问约束

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
[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

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/25 14:31:03

新手网安小白博客学习之旅one

一、2026年6月20日-21日在培训中心学习到了电脑得基本操作,各式各样得快捷指令。二、2026年6月22日了解到电脑硬盘、显示器及文件管理得一些用法。三、2026年6月23日今日了解到电脑的虚拟机得基本内容与设置,并安装以及window的指令操作。四、2026年6月2…

作者头像 李华
网站建设 2026/6/25 14:29:05

Agentic AI实战指南:从目标锚定到工业级Agent落地

1. 这不是又一个“AI热词炒作”,而是你正在经历的底层范式迁移最近在给几家传统制造业客户做智能化升级咨询时,我反复被问到一个问题:“你们说的Agentic AI,和我们正在用的RPA、规则引擎、甚至去年刚上的大模型问答系统&#xff0…

作者头像 李华
网站建设 2026/6/25 14:28:11

Claude / Cursor 接入 API 常见报错与完整解决方案(新手避坑)

最近 AI 编程工具火得一塌糊涂,尤其是 Cursor 加上 Claude 模型的组合,简直是写代码的“物理外挂”。但很多新手在刚上手配置 API 时,往往还没开始爽,就被满屏的报错劝退了。作为一个踩过无数坑的过来人,我花了几天时间…

作者头像 李华
网站建设 2026/6/25 14:26:55

架构设计理念与核心哲学

.NET 生态系统提供原生 AI 编码智能体运行时SharpClawCode 是一个专为 .NET 10 和 C# 13 生态系统设计的 C# 原生编码智能体运行时(coding-agent ru与 Python 或 TypeScript 生态中大量涌现的 AI 编码助手不同,.NET 开发者长期以来缺乏一个真正意义上的原…

作者头像 李华
网站建设 2026/6/25 14:25:02

第24篇-贪心算法入门-为什么局部最优有时能得到全局最优

概述:为什么贪心题看起来简单,却总有人做错 上一篇我们学习了堆与优先队列,重点是如何高效维护 TopK、动态最值和多路合并。 这一篇我们进入另一个核心专题:贪心算法。 很多人第一次接触贪心时,会觉得它很直观&#xf…

作者头像 李华