diff --git a/昇腾950PR架构解读.md b/昇腾950PR架构解读.md new file mode 100644 index 0000000..3b1d4c6 --- /dev/null +++ b/昇腾950PR架构解读.md @@ -0,0 +1,177 @@ +# 昇腾 950PR 微架构及规格详解(面向高性能 Matmul 算子开发) + +> 资料来源(均为华为官方一手资料): +> - 《昇腾 950 NPU 架构白皮书》—— `昇腾NPU知识库/00_硬件/昇腾950_NPU架构白皮书.pdf` +> - CANN 商用版 9.0.0《Ascend C 算子开发》编程指南(NPU 架构版本 351x)—— `昇腾NPU知识库/CANN商用版9.0.0/` +> - CANN 9.0.0 版本说明(确认 950PR 支持特性) +> - cann-samples `matmul_story` 性能建模文档(L2 带宽、MTE 带宽、性能公式)—— `昇腾NPU知识库/代码仓/cann-samples/Samples/2_Performance/matmul_story/` +> - 昇腾官网 Ascend 950PR 产品页 + +--- + +## 1. 产品定位 + +昇腾 950 系列是华为第三代达芬奇(DaVinci)架构旗舰芯片,包含 **950PR** 与 **950DT** 两款,**共架构设计**,通过搭配不同的片上内存实现差异化: + +| | 昇腾 950PR | 昇腾 950DT | +|---|---|---| +| 定位 | LLM **Prefill**、高性能推荐、多模态推理 | 大模型训练 + 推理全流程(含 Decode) | +| 片上内存 | 128GB / **1.6TB/s** | 144GB / **4TB/s** | +| 产品形态 | Atlas 350 加速卡 | Atlas 850E / 950 SuperPoD 超节点、Atlas 650E 服务器 | + +**关键洞察:950PR 是"算力/带宽比"极高的芯片。** 它的算力与 950DT 接近(同架构、同核心规模),但 HBM 带宽只有后者的 40%。这决定了它天然适合 Prefill、推荐这类**计算密集型(高算术强度)**负载。对 matmul 算子开发的直接推论:**在 950PR 上,带宽是最宝贵的资源,Tiling 与 L2/L1 数据复用策略比在 DT 上更关键。** + +## 2. 芯片级架构:Chiplet 合封 + +- 整芯片合封 **2 个 AI Die + 2 个 IO Die + 8 个高速片上内存模块**(950PR;950DT 为 4 个内存模块),通过高速 D2D Clink 与 Memory Interface 互连 +- 全芯片 **UMA(统一内存访问)**:地址空间统一管理,可跨 Die 访问 L2 Cache,Die 间 L2 一致性由硬件维护、软件不感知;L2 具有局部亲和性 +- 满配 36 个 AI 子系统(每个含 1 Cube Core + 2 Vector Core)、4 个 AI CPU Cluster(自研 Linx816,ARMv8-A,物理双线程,每 Cluster 4MB L3)、4 个 DVPP 子系统(4 VPC + 4 JPEGE + 8 JPEGD) +- 新一代硬件调度器 STARS 2.0、128MB 统一 L2 Cache + +## 3. 核心规格表(950PR) + +| 规格项 | 满配 | 衍生版 | +|---|---|---| +| Cube Core (AIC) | 32 | 28 | +| Vector Core (AIV) | 64 | 56 | +| **Cube 算力 BF16/FP16** | **432 TFLOPS** | 378 | +| Cube 算力 TF32 | 216 TFLOPS | 189 | +| Cube 算力 FP8 / HiF8 / MXFP8 | 865 TFLOPS | 756 | +| Cube 算力 **MXFP4** | **1730 TFLOPS** | 1513 | +| Cube 算力 INT8 | 865 TOPS | 756 | +| Vector 算力 FP16/BF16 | 54 TFLOPS | 47 | +| Vector 算力 FP32 | 27 TFLOPS | 23 | +| Vector 算力 INT8 / INT16 / INT32 / INT64 | 54 / 27 / 13 / 6 TOPS | 47 / 23 / 11 / 5 | +| Cube+Vector 总峰值 MXFP4 | **1784 TFLOPS** | 1561 | +| 片上内存容量 / 带宽 | 128GB / 1.6TB/s | 112GB / 1.4TB/s | +| L2 Cache | 128MB | 112MB | +| 互联 | 灵衢 UB 2.0:18 Port × 4×112Gbps,2016GB/s 双向;PCIe 5.0 x16(128GB/s,EP/RC 双模);2×400G UBoE | 同 | + +### 3.1 单核算力与频率(已确认值) + +CANN 官方 matmul 性能建模文档给出的 950PR 硬件参数为 **32 核、1.65GHz**,由此可得: + +- **单 AIC BF16 算力 = 432 / 32 = 13.5 TFLOPS** +- Cube 每拍完成 FP16/BF16 16×16×16 矩阵乘(8192 FLOPs/拍),13.5 TFLOPS / 8192 FLOPs ≈ **1.65GHz**,与官方参数自洽 +- 单 AIC 分摊的 HBM 带宽仅约 **1.6TB/s ÷ 32 ≈ 50GB/s** → BF16 matmul 要喂饱一个 Cube,需要约 270 FLOP/Byte 的算术强度,必须依靠 L1/L2 的大 tile 复用达成 + +## 4. 存储层级与带宽体系 + +### 4.1 存储层级容量(每核) + +| 存储 | 容量 | 对齐要求 | 说明 | +|---|---|---|---| +| 高速片上内存(GM) | 128GB(整芯片) | — | 950PR 1.6TB/s | +| L2 Cache | 128MB(整芯片) | 512B line,4×128B Sector | 全芯片 UMA 共享 | +| L1 Buffer | 512KB / AIC | 32B | 推荐 NZ 分形 | +| L0A Buffer | 64KB / AIC | 512B | 左矩阵,**351x 架构改为 NZ 分形** | +| L0B Buffer | 64KB / AIC | 512B | 右矩阵,ZN 分形 | +| L0C Buffer | **256KB / AIC** | 64B | 矩阵乘结果/中间结果(FP32 累加),比上代更大,Tiling 更灵活 | +| Unified Buffer (UB) | 512KB / AIV | 32B | 向量计算主存储,无格式要求 | +| SIMD RegFile | VL = 256B 位宽 | — | UB 与 Vector ALU 间新增寄存器层,中间结果不必回写 UB | +| SIMT RegFile | 128KB / AIV | — | SIMT 线程寄存器(1~256 线程时每线程 127 个寄存器) | + +### 4.2 带宽数值总表(950PR,32 核 / 1.65GHz 满配) + +| 链路 | 带宽 | 出处与说明 | +|---|---|---| +| **GM(HBM)总带宽** | **1.6TB/s** | 白皮书规格值,**不区分读写单向** | +| **L2 Cache 带宽** | **5.2TB/s**(≈ GM 的 3.3 倍) | cann-samples matmul_story 性能建模文档(32核/1.65GHz/1.6TB/s 参数与 950PR 满配一一对应) | +| MTE2(GM/L2→L1) | 受 HBM 与 L2 共同决定,见 4.3 综合带宽模型 | 矩阵数据唯一入口 | +| MTE1(L1→L0A/L0B) | **256 BPC ≈ 422.4GB/s**(单 AIC) | 同上(BPC = Byte Per Cycle,×1.65GHz 换算) | +| MTE3 / Fixpipe 搬出(L0C→GM/UB) | **256 BPC ≈ 422.4GB/s**(单 AIC) | 同上 | +| Vector ALU | 256B/拍 | 架构规格文档 | + +> 注意区分:CANN 文档中"L2 192MB / 读写混合带宽 7TB/s / GM 1.6TB/s"的 L2 Cache 切分案例针对的是 Atlas A3 系列(L2 192MB),**不是 950PR**(L2 128MB)。950PR 应使用 **L2 = 5.2TB/s** 这一数值。 + +### 4.3 GM 带宽要不要区分读写? + +**结论:建模与分析时要区分,但官方只发布总带宽 1.6TB/s,单向读写带宽无公开数值,需以 msProf 实测为准。** 要点如下: + +1. **官方规格口径**:白皮书只给出 1.6TB/s 总量,未区分读/写。HBM 物理上读写共享数据总线,读+写合计不能超过总带宽;读写混合流量还存在总线转向(bus turnaround)开销,混合流的有效带宽低于纯读。 +2. **Profiling 口径是分读写的**:msProf `op_summary` 提供 `main_mem_read_bw` / `main_mem_write_bw`(GM 读/写带宽)、`ub_read_bw` / `ub_write_bw`、`l1_read_bw` / `l1_write_bw` 等字段。注意 **Atlas 350 加速卡(即 950PR)不支持 `l2_read_bw` / `l2_write_bw` 字段**,L2 带宽需结合 MTE2 流水与命中率间接评估。 +3. **Matmul 场景的读写竞争来源**: + - 读侧:MTE2 搬入 A/B 矩阵(matmul 的主要 GM 流量); + - 写侧:Fixpipe/MTE3 搬出 C 矩阵; + - 隐藏写流量:**L2 Cache 淘汰写回**。当数据访问总量超过 L2 容量(128MB),替换出的脏数据需先写回 GM,占用 GM 写带宽,再读入新数据——这是大数据量 matmul 中容易被忽视的带宽损耗,也是对一次性输出设置 L2 `non-allocate` hint 的动机。 +4. **MTE2 综合带宽模型**(官方 matmul 性能建模文档): + + ``` + BandWidth_MTE2 ≈ (1 - L2HitRatio) × 1.6TB/s + L2HitRatio × 5.2TB/s + T_MTE2 ≈ Size_HBM / 1.6TB/s + Size_L2 / 5.2TB/s + ``` + + 其中 `Size_HBM` 为首次从 HBM 搬入的数据量,`Size_L2` 为命中 L2 的重复搬运量。工作集超过 L2 容量或存在多核竞争时以实测为准。 + +## 5. AI Core 微架构(351x 架构版本) + +950 系列对应 CANN 的 **NPU 架构版本 351x**,AIC/AIV 分离架构,配比 **1:2**,每核有独立 Scalar 单元、可独立加载代码段。 + +![昇腾950PR_数据通路](昇腾950PR_数据通路.svg) + + + +### 5.1 数据通路(351x 相对上代的关键变化) + +- **删除** GM→L0A/L0B 直达通路、L1→GM 回写通路 → **一切矩阵数据必须经 L1 进入**,Tiling 设计围绕 L1(512KB) / L0A/L0B(64KB) / L0C(256KB) 三级组织 +- **新增 L0C→UB、UB↔L1 直连通路(CV 融合通道)**:matmul 结果可从 L0C 直接送 AIV 的 UB 做后处理(Softmax、GELU 等),不必绕道 GM——这是 FlashAttention 类融合算子单核性能提升 1.5~2 倍的硬件基础 +- **新增 UB↔L1 硬通道**、GM↔UB 搬运支持 Loop 模式(Normal/Compact) +- **Fixpipe 随路硬化**:L0C 输出阶段直接完成 FP32/INT32 → BF16/FP16/FP8/INT8 量化、ReLU/PReLU/LeakyReLU 激活、NZ↔ND/DN 排布转换(Channel merge/split)→ matmul+量化融合零额外搬运 +- **NDDMA 指令**:核内多维 DMA,最多 5 维重排随搬运完成,硬化地址生成,内置缓存把离散读聚合成 128B 访问 +- **AIC↔AIV 核间通信走 SSBuffer**(上代走 GM),延迟更低 + +### 5.2 Cube Core(矩阵计算单元) + +- 支持 FP32 / TF32 / FP16 / BF16 / HiF8 / FP8_E4M3 / MXFP8 / MXFP4 / U8 / S8 +- 每拍:FP16 16×16×16;INT8 16×32×16;**FP8 系 = 2× BF16 算力,MXFP4 = 4× BF16 算力** +- L0C 更大(256KB)→ 更灵活的 Tiling、更高数据复用率 +- **HiF8**:华为自研 8bit 浮点,变长前缀码指示阶码位宽,锥形精度,38 个阶码([-22, 15],接近 FP16 的 40 个),无需 MXFP8 的 8bit 缩放因子 + +### 5.3 Vector Core(向量计算单元) + +- 从传统 SIMD 升级为**双发射 Register-Based SIMD**,支持乱序执行;单核 FP16/FP32 算力较上代**提升 100%** +- 原生 BF16,丰富量化/反量化转换指令;针对 Softmax、GELU 优化微架构 +- **SIMD/SIMT 混合编程**(SIMD 为主、SIMT 为辅):SIMT 面向 gather/scatter、复杂分支;每 AIV 4 个 Warp Scheduler、128KB SIMT RegFile、最大 128KB DCache(复用 UB 作 cacheline,访存粒度 128B) +- UB bank 结构升级:每个 bank group 两组读写口,最多同时 2 读或 1 读 1 写(上代 1 读或 1 写) + +### 5.4 同步机制 + +- 新增 **BufferID 同步**(`get_buf()`/`rel_buf()`,类互斥锁语义),比 set_flag/wait_flag 内聚性更强 +- 核内同步:SetFlag/WaitFlag + EventID(需成对、及时释放、勿手动占用预留 ID) +- 核间同步:CrossCoreSetFlag/CrossCoreWaitFlag,支持 AIC:AIV 1:1 与 1:2 模式,flagId 0~10、同一 ID 最多计 15 次 +- **注意:Matmul 高阶 API 内部已使用 CrossCore 核间同步,不要与其混用,避免 flagId 冲突** + +## 6. 周边子系统(简版) + +- **L2 Cache 128MB**:多 Bank 分布式、512B 低位交织(高位异或)、512B Cache Line + 128B Sector Cache(128B/256B 访问更高效)、每 Bank 支持同时读写;支持算子可控 **L2 hint**(allocate / non-allocate)与 **CMO**(Prefetch/Writeback/Invalid/Flush);离散小包、随机访存场景同带宽下性能较上代提升 2 倍+ +- **STARS 2.0**:2048 条任务流 Host 下沉;HSCB 专用高速控制总线,调度开销 ns 级;支持最多 8 个 Group 的亲和性调度(按 Die 分组利用 L2 局部性);算力切分(AIC/AIV/SDMA 最多 16 资源池) +- **AI CPU**:4 Cluster × 2 Linx816(ARMv8-A,物理双线程),承载控制类任务与 CPU 类算子 +- **互联**:灵衢 UB 2.0,2016GB/s 双向;URMA 异步语义(Jetty 队列,RTP/CTP 两种传输层)+ UB Memory 同步语义(Load/Store/Atomic,最高 128TB 内存共享);**CCU 集合通信硬件卸载**(Broadcast/ReduceScatter/AllGather/AllReduce/All2All(v));超节点规模 384 卡 → **8192 卡**,集群 >128K 卡 + +## 7. 对 Matmul 算子开发的启示 + +1. **数据通路约束**:GM→L0A/L0B 无直达通路,一切矩阵数据经 L1。L0C 256KB 恰好放下 256×256 FP32 累加块(单份),即 baseM = baseN 的理论上限约 256。 +2. **Tiling 目标 = Cube Bound**:以官方建模公式判断瓶颈流水,`T_total = max(T_MMAD, T_MTE2, T_MTE1, T_FIXPIPE [, T_VF])`: + - 避免 MTE1 Bound:baseM = baseN ≥ 80(16 的倍数)即可使 MTE1 耗时低于 MMAD; + - 避免 MTE2 Bound:baseM = baseN = 256 时达成 Cube Bound 需 MTE2 带宽 ≥ 2.64TB/s——超过 HBM 的 1.6TB/s,**必须靠 L2 命中补足:L2 命中率达到约 28.9% 时 MTE2 不再是主瓶颈**; + - 数据量超 L2 容量时使能 **L2 Cache 切分**(Matmul 高阶 API 已支持)。 +3. **AIC:AIV = 1:2**:优先使用 AscendC Matmul 高阶 API(已处理 Cube/Vector 流水编排与核间同步);手写底层 matmul 注意 CrossCore flagId 冲突。 +4. **优先利用 CV 融合通路**:matmul 后接量化/激活/Softmax 时走 L0C→UB / Fixpipe 随路处理,避免 GM 往返——在带宽紧张的 950PR 上收益比 950DT 更大。 +5. **低精度是算力大头**:1784 TFLOPS 峰值只有 MXFP4 能达到,FP8 系为 BF16 的 2 倍。推理 matmul 优先考虑 MXFP8/HiF8(权重 weightNz 格式)+ Fixpipe 随路反量化;CANN 9.0.0 起 950PR 新增 MM 融合算子与 mxfp8 weightNz 支持。 +6. **精打细算 GM 带宽**:权重驻留 L2(hint)、一次性输出设 non-allocate(避免挤占 L2 并减少淘汰写回的 GM 写流量);读写共享 1.6TB/s 总带宽,C 矩阵搬出与 A/B 搬入存在竞争。 +7. **参考实现**:`昇腾NPU知识库/代码仓/catlass`(华为开源矩阵计算模板库,类 CUTLASS)、`代码仓/ops-math`、`代码仓/ops-blas`(gemm)、`代码仓/cann-samples/Samples/2_Performance/matmul_story`(含普通/量化/MXFP8/MXFP4 matmul 的完整性能建模与调优案例)。 + +## 8. 关键数值速查 + +| 参数 | 数值 | +|---|---| +| AIC / AIV 数量 | 32 / 64(满配),28 / 56(衍生) | +| 主频 | 1.65GHz | +| Cube 算力 BF16 | 432 TFLOPS(单 AIC 13.5) | +| Cube 算力 FP8 / MXFP4 | 865 / 1730 TFLOPS | +| GM 容量 / 带宽 | 128GB / 1.6TB/s(总带宽,读写共享) | +| L2 容量 / 带宽 | 128MB / 5.2TB/s | +| L1 / L0A / L0B / L0C / UB | 512KB / 64KB / 64KB / 256KB(每 AIC);512KB(每 AIV) | +| MTE1 / MTE3 带宽 | 256 BPC ≈ 422.4GB/s(单 AIC) | +| Cube Bound 最小 MTE2 带宽(baseM=baseN=256) | 2.64TB/s(L2 命中率 ≥28.9% 可达成) | +| 互联带宽 | UB 2.0 2016GB/s 双向;PCIe 5.0 x16 128GB/s |