Qwen3 + NPU 仿真实战
第二节:单个 MAC 单元设计(16×16 阵列,支持 INT8/BF16)
1. MAC 单元在 LLM 推理中的作用
Qwen3 推理的主要计算量来自矩阵乘法(MatMul/Linear),涵盖 QKV 投影、Attention Score 计算、MLP 等线性算子。NPX6 的 MAC 阵列用于加速这些乘累加运算。
1.1 Feature Map 与 Coefficient 在 LLM 中的对应
| NPU 术语 | LLM 对应 | 说明 |
|---|---|---|
| Feature Map (FM) | 激活值 | 输入 hidden states、Q/K/V 向量 |
| Coefficient (CF) | 权重 | Wq、Wk、Wv、Wo、gate/up/down_proj |
以 Qwen3 0.6B 的 Q 投影为例(hidden_size=1024):FM 形状为 [batch, seq_len, hidden_size],CF(Wq)形状为 [hidden_size, hidden_size],即 [batch, seq_len, 1024] × [1024, 1024]。
2. 16×16 MAC 阵列结构
2.1 阵列维度参数
| 参数 | 值 | 含义 |
|---|---|---|
| ISIZE | 16 | 通道向量化维度 |
| VSIZE | 8 | 空间向量化维度 |
| 单元 MAC 数 | 256 | ISIZE × ISIZE |
BF16 浮点模式下,阵列内 256 路乘法并行产生乘积,并对每个输出通道的 16 个乘积求和,形成 16 个输出通道的部分和。
注意:阵列的物理维度由ISIZE决定,与mpy_cfg_t选择的 INT8/BF16/FP16 模式无关;不同数据格式复用同一 16×16 乘法阵列。
Slice 级吞吐差异:单个 Slice 在 INT8(i_8b8b_e)模式下每周期提供 4096 个 8b×8b MAC;在 BF16/FP16(f_bfloat16_e/f_fp16_e)模式下每周期等效 1024 个 16b×16b MAC,吞吐约为 INT8 的 1/4。
原因:INT8 模式下每个乘法单元每周期产生两路 8b×8b 乘积(even/odd),而 BF16/FP16 模式下只产生一路尾数乘积且 Feature Map 为双宽输入需要两周期供数,因此 Slice 级有效并行度为 1/4。
3. BF16 数据格式
3.1 BF16 格式定义
BF16: [sign:1][exponent:8][fraction:7] = 16 bits| 字段 | 位宽 | 说明 |
|---|---|---|
| sign | 1 bit | 符号位 |
| exponent | 8 bits | 指数,与 FP32 相同 |
| fraction | 7 bits | 尾数 (隐含前导 1) |
3.2 BF16 优势
以下为 BF16 的通用特性(IEEE bfloat16 标准),用于解释本节为何选 BF16 浮点模式作为示例,不属于 RTL 直接定义的参数。
- 8 位指数提供与 FP32 相同的动态范围
- 相比 FP32,权重存储占用理论上减半
4. MAC 单元流水线
4.1 流水线阶段
| 阶段 | 模块 | 功能 |
|---|---|---|
| Stage 0 | 输入寄存级(lane 内) | FM/CF 输入与控制信号寄存 |
| Stage 1 | npu_conv_mpy_mul | 16×16 BF16 乘法与最大指数提取 |
| Stage 2 | npu_conv_mpy_sum | 乘积按最大指数对齐并部分求和 |
| Stage 3 | npu_conv_mpy_sn | 最终求和(生成 lo/hi 部分和) |
| Stage 4 | npu_conv_mpy_norm | 浮点归一化与舍入 |
| Stage 5 | npu_conv_mpy_acc | 32 位累加器更新 |
4.2 BF16 乘法器设计
每个 BF16 乘法器包含:
- 11×11 位尾数乘法器 (含隐含 1)
- 8 位指数加法器
- 符号异或逻辑
4.3 求和与归一化
浮点模式下:mul 阶段生成乘积并找最大指数(maxexp);sum 阶段按 maxexp 对齐并部分求和;sn 阶段做最终求和;norm 阶段归一化后送入累加器。
5. 配置模式
| 模式 | 编码 | Feature Map | Coefficient |
|---|---|---|---|
| f_bfloat16_e | 7’b0100000 | BF16 | BF16 |
| f_fp16_e | 7’b1000000 | FP16 | FP16 |
| i_8b8b_e | 7’b0000001 | INT8 | INT8 |
BF16 浮点模式下,阵列部分和进入 32 位累加器(acc_t/ixacc_t),由npu_conv_mpy_acc执行浮点累加实现跨周期累加。
6. 与 Qwen3 推理的映射
6.1 分块策略
以 Q 投影(hidden_size=1024,对应权重矩阵 1024 × 1024)为例:
- 每次加载 16 个输入通道到 FM 寄存器
- 每次加载 16×16 权重块到 CF 寄存器
- MAC 阵列并行计算 256 个乘积并形成 16 个部分和
- 沿 K 维分块累加 64 次(1024/16),得到该 16 个输出通道块的最终结果
- 沿输出通道维重复 64 个块,覆盖全部 1024 个输出通道
6.2 计算效率
单个 16×16 MAC 单元每周期并行产生 256 个 BF16 乘积,并输出 16 个部分和。
7. 总结
NPX6 的 16×16 MAC 单元承担 Qwen3 推理中 MatMul/Linear 的主要计算:
- 阵列结构:16×16 BF16 乘法器,每周期并行产生 256 个乘积、输出 16 个部分和
- 数据映射:FM 对应激活值,CF 对应权重
- 流水线:5 级计算流水(mul/sum/sn/norm/acc),前端含输入寄存级
- 精度:BF16 格式平衡精度与效率