Ascend 950 微架构速查:来自 FlashMLA 算子报告的硬件信息整理
| 2026-09-30 |
信息整理。全部数值来自单一来源:deepseek-ai/FlashMLA 仓库官方文档《Ascend Sparse Attention Forward 算子与优化技术简析》(深度求索著,MIT License,本站存档为 《Ascend950 稀疏注意力 Forward 算子与优化技术简析》,下称「源文档」),逐条标注出处章节。口径是算子视角的微架构,不是官方 data sheet;性能数字为厂商自报,无第三方复现。另有三处补充:DeepGEMM-Ascend 与 DeepEP-Ascend 仓库 README(缩放因子格式、卡级型号),以及 2026-09-30 对 FlashMLA 仓库的代码深读(B_TOPK 最终取值、MTE2 在飞数、VLOOP 检出情况,随条标注 file:line)。 |
一、AI Core:1 Cube + 2 Vector
| 项 |
数值 |
源文档出处 |
| AI Core 构成 |
1 CUBE Core + 2 VECTOR Core(本算子实际采用 1C2V,1C1V 被三个瓶颈否决,见第四节) |
〈能否用 1C1V〉 |
| CUBE Core 吞吐 |
4096 FMA/cycle(打满口径);关闭 HF32 mode 时降至 256 FMA/cycle |
〈每个 AI Core 负责多少个 q head〉〈FA 的 output accumulator 在哪里做〉 |
| MMAD 特性 |
M 维取 64 即可打满 CUBE 吞吐 |
〈每个 AI Core 负责多少个 q head〉 |
| L0C 容量 |
约 256 KB(128×512 float32 即占满;只能被 FixPipe 搬出或被 CUBE 用作累加器,无法原地乘标量) |
〈FA 的 output accumulator 在哪里做〉 |
| 核数 / 频率(该分析场景) |
32 个 AI Core,主频 1.65 GHz |
〈每个 AI Core 负责多少个 q head〉的存算比脚本 |
二、存储层次:L1 双 bank、L2 5 TB/s
| 层级 |
数值 / 特性 |
源文档出处 |
| L1 |
512 KB,分两个 bank(0–256K / 256K–512K 两段地址空间);Tensor 切两份配平摆放可打满双 bank 带宽 |
〈L1 bank 配平〉 |
| L2 |
总带宽 5 TB/s(32 核分摊)——注意是片上 L2,不是 HBM |
〈每个 AI Core 负责多少个 q head〉 |
| UB |
有 bank conflict 问题(NZ buffer 额外 pad 一行规避);读写带宽可被单个 SIMD VF 打满 |
〈高速 ND2NZ〉 |
| icache |
CUBE 32 KB / VECTOR 16 KB / SIMD VF 8 KB——代码体积需控制(报告建议用 VLOOP 硬件循环、慎用内联;代码深读未在源码检出该符号) |
〈icache miss 问题〉 |
三、搬运与流水约束
- MTE2 在飞请求上限 16 个(单 VECTOR Core 的 Issue Queue 深度)——稀疏 gather 逐 token 发请求会爆队列,催生 gather2 技巧(
burst_count=2、src_stride 设两 token 地址差,一次拷两个 token)。(〈gather2〉〈能否用 1C1V〉)
- FixPipe 向外搬运 128 Byte/cycle/AI Core——1C1V 被否的三个瓶颈之一;1C1V 口径下由此推出
B_TOPK > 73.14。最终 1C2V 代码实际取 B_TOPK = 64(config.h:55),每 AIV 32 token、gather2 折半后恰好 16 个在飞 MTE2 请求——与 16 的队列深度持平。(〈能否用 1C1V〉;代码深读 kernel_body.h:1041)
- BIU 访存合并条件:源和目标都连续才合并。「源连续、目的不连续」无法合并,L2 带宽利用率低——KV 的 ND2NZ 被迫绕行 UB 用 SIMD VF 完成,而不是走 GM→L1 随路转换。(〈KV 的 ND2NZ Layout 转换何时进行〉)
- 硬件 PIPE 顺序发射、顺序执行:
PIPE_V 前一条不发射会阻塞整条管线;跨核信号用 SS buffer + cross core flag(能读写 SS buffer 的只有 scalar core)。(〈如何进行 skip-scale 的同步〉〈流水线〉)
四、数值格式与 KV Cache layout
- KV Cache 支持 FP8 / FP4,使用时反量化为 bfloat16 送 CUBE;decoding 工况下 1C1V 时反量化带宽追不上 CUBE(micro-benchmark),也是 2V 的理由之一。(〈能否用 1C1V〉)
- 本算子把一个 token 的 data 与 scale 相邻放置(旧版 FlashMLA 是块内 data 全在前、scale 全在后),MTE2 一次拷齐。(〈Decoding KV Cache Layout 优化〉)
- scale-O 在 NPU 上代价高(FixPipe 搬 L0C→UB、再 VF 累加),因此 skip-scale(rescale 阈值
exp(6))在 NPU 上收益比 GPU 更大。(〈算法回顾〉〈如何进行 skip-scale 的同步〉)
- 补充(另一来源):DeepGEMM-Ascend README 载明昇腾侧缩放因子格式为一对 UE8M0 打包进 int16、MN-major,与 NVIDIA 格式不同。
五、设计决策的硬件依据
源文档最有价值的部分,是把四个设计选择全部还原成硬件数字:
- 为什么每 AI Core 64 个 q head:存算比按 CUBE 4096 FMA/cycle、L2 5 TB/s 计算,head ≥ 64 才是 compute bound;head=128 会把 L0C 撑爆(128×512 float32 = 256 KB),且 MMAD M=64 已够快。(存算比对照表见源文档,head×topk 从 16×512 到 128×1024 共 8 组数据)
- 为什么 1C2V 而非 1C1V:三个 bound——MTE2 队列深 16、反量化带宽、FixPipe 128 B/cycle。
- 为什么 KV 经 UB 绕行做 ND2NZ:BIU 只在源、目的都连续时合并访存。
- B_TOPK 的两个口径:1C1V 讨论里 FixPipe bound 要求
> 73.14(报告建议 96/128);最终 1C2V 代码取 64,gather2 折半后每 AIV 恰好 16 个在飞 MTE2 请求,与 16 的队列深度持平(FlashMLA config.h:55、kernel_body.h:1041)。
六、性能锚点与边界
- DeepSeek V4.1 典型工况:稀疏注意力 prefill 410 TFLOPS(硬件峰值 95%)、decode 360 TFLOPS(83%)——厂商自报。
- 本文档没有的:HBM 容量与带宽、TDP/功耗、卡间互联、Die 面积。L2 的 5 TB/s 是片上带宽,勿与 HBM 混淆。卡级信息全批开源材料里仅出现「950DT」型号名与 Atlas 850E 超节点字样(出自 DeepEP-Ascend README),无 data sheet。
来源