夜雨聆风学习资料网

ARTICLE · 1228601

AI芯片设计:混合精度如何一条数据通路吃下 FP32 到 FP4

AI芯片设计:混合精度如何一条数据通路吃下 FP32 到 FP4

先说结论:这颗 16×16 的 weight-stationary 脉动阵列,在 TSMC 28 nm、1 GHz 下做到 FP32/BF16/FP8/FP4 峰值 0.5/1/2/4 TOPS,全格式(含 INT 与 MX)路由后单元面积 3.27 mm²、峰值功耗 1.85 W,FP4 每操作 0.45 pJ。它想回答的不是"能不能支持多格式",而是两个更硬的问题:共享一条数据通路时,吞吐怎么随位宽等比缩放;以及支持 MX 块尺度,到底要多付多少面积和能耗。

论文来自 University of Washington(Jiayi Wang、Kearnan Bishop 共同一作,Ang Li 通讯),ICCD 2026 接收,arXiv 2610.19645。

一、一个模型里早就不止一种精度

论文开篇列的例子很能说明问题:DeepSeek-V4 在注意力和 MoE 内部就混着用精度——KV 在 RoPE 维度保 BF16、其余用 FP8,lightning indexer 用 FP4 算注意力,MoE 专家权重存 FP4、反量化到 FP8 再算。Nemotron 3 Ultra 干脆按算子分配:路由专家 NVFP4、共享专家与 Mamba mixer FP8、注意力与 embedding BF16,KV cache 是 FP8。Kimi K2 Thinking 的专家量化到 INT4。

低精度省显存、省带宽、提高有效算力,但同时压缩动态范围与尾数,精度仍然是敏感选项;而长归约又要求高精度累加,所以生产系统普遍保留 FP32 累加。

硬件侧的对照是商用矩阵引擎:H100 的 Tensor Core 覆盖 BF16/FP16/FP8/FP32-class/INT,B200 增加 FP4 与 MX,TPU7x 与 Trainium3 也都在多个低精度模式上给出接近等比的吞吐,累加仍是 FP32。论文表 1 把这些产品按"相对自家 BF16 的倍数"归一化:H100 的 FP8 是 2×、B200 的 FP4 是 4×、Trn3 的 MXFP8/MXFP4 都是 4×。

于是架构目标很清楚:多格式 + 近似等比的吞吐缩放 + FP32 累加。但公开文献里,"用什么微架构机制实现"和"多加一种格式要付多少钱"这两件事一直没被认真表征。这篇论文就是补这两块。

二、为什么不能每种格式复制一条通路

最直接的多格式实现是给每种格式复制一条独立数据通路。面积、布线、控制逻辑一起膨胀,而且工作负载很少同时跑满所有格式,复制出来的硬件大部分时间在闲置。

第二个坑来自 MX。OCP MX 把每 32 个元素划成一块,共享一个 E8M0 指数(纯 2 的幂)。一个 PE 覆盖的跨度超过一个 MX 块时,相邻块的部分和不能直接相加——它们带着不同的尺度。朴素做法是每列保留两个 FP32 状态(块内累加器 + 跨块运行和),再在每个块边界放一个专用 FP32 加法器。这条"第二累加通路"就是 MX 支持的主要开销。

MFSA 的两个设计正好对应这两个坑:PE 级用点积累加器(DPA)共享宽数据通路,阵列级用 OBSR 把块尺度折进运行累加器的指数域。

三、机制一:把 FMA 换成点积累加器

传统脉动阵列的叶单元是一次 FMA。MFSA 的叶单元是一个点积累加器(DPA),一次吃 k 个窄操作数、出一个高精度结果,k 随位宽变化:1 路 FP32/INT16、2 路 BF16/FP16/INT8、4 路 FP8/INT4、8 路 FP4。这样吞吐就随精度等比放大,而 PE 之间的连线和部分和网络不用为低精度加宽。

数据通路有五个部件:指数处理路径;以 24×24 可重构乘法器为核心的尾数乘法路径(可切成 2、4、8 个窄乘积,各自带加法树);对齐移位器(把乘积尾数与累加中的 FP32 尾数对齐);76 位宽的累加器;以及输出前的归一化/舍入级。

76 位这个数字值得停一下:24 位 super-mantissa,加 2 位 guard/round/sticky,再加 FP32 动态范围对齐所需的余量。乘法器产出 k 个 carry-save 形式的乘积,由共享加法树在不中途舍入的前提下归约;carry-save 结果经一个移位器对齐到 FP32 累加器的运行指数;最后一颗 round-to-nearest-even 舍入器产出下一个 FP32 部分和。

也就是说,k 个乘积只做一次 IEEE-754 归一化和一次 RNE,而不是 k 次。这就是 DPA 相对"级联 k 个单格式 FMA"的面积优势来源,而且 k 越大优势越大。

整数支持走的是"蹭槽位":INT16 用 FP32 的 24×24 乘法器(k=1),INT8 用两路 FP16 点积通路(k=2),INT4 用四路 FP8 通路(k=4,正好——E4M3 的 lane 有 4 位有效数:3 位存的尾数加隐含位)。乘法器和累加器原样复用,整数只多出符号扩展、有符号/无符号选择和一个绕过 FP 归一化的输出 mux。代价是:同宽度的 INT 只有 FP 的一半速率(INT8 追平 BF16/FP16,而不是追平 CFP8)。

图 1:横轴是正数量级范围(10 的 −40 到 40 次方量级),每一行是一种格式的编码。FP32 与 INT4 的动态范围差了十几个数量级,MX 格式则靠共享块指数把 FP4/FP8 的量级整体平移——这张图解释了为什么"一个数据通路通吃"必须把指数处理单独拎出来做。

图 2:(a) 顶层 M×N 脉动阵列,权重从上方预载、激活自西向东带行偏斜流动、部分和沿南北向级联;(b) 四个纵向相邻的 MFPE 加一个北边界 OBSR 组成 BPE——MXFP4(k=8)正好一个 BPE 一块,MXFP8(k=4)跨两个 BPE;(c) MFPE 内部:DPA 加指数/对齐/归一化;(d) OBSR 单元只做指数域的加减;(e) DPA 内部:24 位乘法器切成多路、共享加法树、76 位累加。

图 3:每组左边是 DPA-PE,右边是把 k 个单格式 FMA 单元级联起来、做到同吞吐同延迟的基线。2 路 FP16 与 2 路 BF16 都是 1.5×,4 路 FP8 是 2.5×,8 路 FP4 是 4.5×。柱高分别是 8.6、7.6、8.3、8.9 千平方微米(DPA 侧)。差距随 k 变大,正是"把一次归一化摊到 k 个乘积上"的直接后果——低精度推理恰好是 k 最大的区间。

四、机制二:OBSR,把块尺度加进指数

MX 的点积可以写成两层:块内是 32 个低精度元素的乘积和(DPA 已经算完),块间是每块一个 2 的幂尺度。

朴素脉动实现要为每个块边界维护第二个 FP32 累加字和一个跨块加法器。OBSR 的做法是:在累加新块之前,把继承下来的累加器重定标到新块的尺度,于是两者共享同一个尺度、可以直接在原有 FP32 级联上相加——不需要第二累加器,也不需要跨块加法器。

一般情况下,"除以旧尺度再乘新尺度"并不便宜,可能比它替掉的加法器还贵。OBSR 之所以便宜,是因为 MX 的块尺度是 E8M0,也就是纯 2 的幂:乘除 2 的幂等于给 FP32 的指数字段做整数加法,尾数一位都不动。

实现上它维护一个运行累加器 S 和一个 10 位有符号的运行尺度 s_cur,两者共同表示 V = 2^s_cur × S。到块边界时:先把进入的两个块尺度合成一个 2 的幂(一次加法),再把 S 重定标(只改指数字段,一次减法加一次加法),最后更新 s_cur。两次加法、一次减法,尾数不动。

特殊值也处理了:E8M0 的有限编码是 0x00–0xFE,0xFF 是保留的 NaN 码(没有零和无穷编码),NaN 尺度会以 quiet NaN 穿过 FP32 累加器;重定标绕过 ±0 与 Inf/NaN,越界时夹到 FP32 的边界(上溢到 ±∞,下溢冲刷到零)。MXFP6 则靠运行时 recast 到 MXFP8 支持。

代价是:S 存的是 V 除以 2^s_cur,如果某个块的尺度离累加历史太远,S 会被夹住,而"另存一个 V 的 FP32 累加器"不会。论文说真实 trace 上没发生过,后面用 168 个 GEMM 验证了这一点。

图 4:横轴从左到右逐步打开格式。PE 级(上)从 6.4 千平方微米涨到 13.5;阵列级(下)从 BF16 的 1.62 mm² 到 BF16+CFP8 的 2.60,全 FP 六格式 2.78(+6.9%),再加 INT16/8/4 到 3.21(再 +15.4%)。共享数据通路的好处就在这里:加 FP32、FP16、FP4 三种格式只多 6.9%,因为它们是复用而不是复制。

图 5:左图面积,右图 FP8 每操作能耗。无 MX 基线 2.633 mm² / 0.459 pJ;OBSR 2.705(+2.7%)/ 0.484(+5.4%);朴素双累加器 2.834(+7.6%)/ 0.536(+16.8%)。折算下来,OBSR 把 MX 的增量面积砍掉 64.2%、增量能耗砍掉 67.5%。全格式阵列上 MX 只再加 1.8%,得到 3.27 mm²。

五、数值:168 个真实 GEMM 上的 ULP

OBSR 与朴素方案的区别不只是硬件,还有加法顺序:朴素方案先把每块 32 个乘积归约成一个 FP32 块和,再顺序累加 N/32 个块和;OBSR 保留原始脉动阵列的累加顺序,等价于直接顺序累加 N 个乘积。

作者用 4 个模型(Qwen2.5-0.5B/1.5B/3B-Instruct、SmolLM2-1.7B-Instruct)的 prefill 与 decode trace,取了 168 个 GEMM,覆盖投影层(down/up/o_proj,三个解码深度)与注意力的 QKᵀ、P·V,上下文 74 到约 430 token,FP64 按绝对值升序累加作为黄金参考。

结果:MXFP4 与 MXFP6 E2M3 上两种方案逐位一致(块和恰好可被 FP32 精确表示);MXFP8 上投影 GEMM 的 p95 差在 6 ULP 内,注意力 GEMM 在 0.62 ULP 内。两者没有谁稳定更接近黄金值——朴素方案略多一点情况更近,因为它的块内归约更接近成对求和。阵列规模从 16 行到 256 行、prefill 与 decode 两条路径,p95 曲线几乎重合;大 ULP 离群只出现在 FP64 参考接近零(相消)时,最坏绝对误差低于 3×10⁻⁵,比 MX 量化本身的底噪小至少 395 倍。

对抗性构造(跨块动态范围极宽、交替符号相消、离群值、接近非规格化的尺度)能触发 2,242 次 clamp,MXFP4/MXFP6 的偏差约 10⁻² 量级,MXFP8 E4M3 能到 8.19×10³。但真实 trace 的块尺度分布 σ 只有 0.7–1.4,合成扫描要到 σ≈32(乘积铺满 FP32 整个指数范围)才开始出现 clamp。

图 6:(a) 输出严格更接近 FP64 黄金值的比例——OBSR 与朴素互有胜负,MXFP4/MXFP6 是逐位一致,MXFP8 两者都落在少数几个百分点内;(b) p95 误差随阵列行数(16 到 256)的变化,两条虚线分别是"单次全长 K 累加"和"理想树形归约",实线是 OBSR 与朴素 E4M3/E5M2——四条曲线几乎重合(解码与 prefill 都在内)。

六、全格式的价目表

输入格式
累加
吞吐 (TOPS)
功耗 (W)
能耗 (pJ/op)
FP32
FP32
0.512
1.89
3.68
FP16
FP32
1.024
1.87
1.83
BF16
FP32
1.024
1.85
1.80
CFP8
FP32
2.048
1.85
0.90
FP4
FP32
4.096
1.85
0.45
INT16
INT32
0.512
1.74
3.41
INT8
INT32
1.024
1.72
1.68
INT4
INT32
2.048
1.74
0.85
MXFP8
FP32
2.048
1.85
0.90
MXFP4
FP32
4.096
1.85
0.45

几个可以直接读出来的结论:吞吐严格按 2 倍阶梯走(0.512 → 1.024 → 2.048 → 4.096),对应每 PE 每周期 2/4/8/16 GOPS;功耗几乎不随格式变(1.72–1.89 W),所以能耗基本就是吞吐的倒数;MX 模式的数字与同宽度非 MX 完全一致——块尺度支持没有在吞吐或能耗上留下痕迹。

面积链条也清楚:BF16 阵列 1.62 mm²,BF16+CFP8 基线 2.60,全 FP 六格式 2.78(+6.9%),加 INT 3.21(累计 +23.5%),再加 MX 3.27(累计 +25.7%,其中 MX 本身 +1.8%)。

图 7:(a) 布线后的裸片,2.40×2.40 mm²;(b) 同一张图把 256 个 MFPE 逐个阴影标出,可以看出阵列的规则性是面积效率的前提。signoff 单元面积 3.27 mm²,核心利用率 59%,MFPE 延迟 4 个周期。

与唯一的 MX 单元级对比对象 Vmxdotp 比:MFSA 的 MXFP8 是 0.63 TOPS/mm²、1.11 TOPS/W、0.90 pJ/op,MXFP4 是 1.25、2.21、0.45;Vmxdotp 在 12 nm 下是 0.69 / 0.75 / 1.33 与 1.37 / 1.57 / 0.64。MFSA 的单位面积算力略低,但单位功耗算力高约 1.5 倍——注意 Vmxdotp 只是 FPU,不含阵列、存储和布线,两者不是同一层级的东西,论文自己也标注了这一点。

七、两个边界讨论:NVFP4 与整数

NVFP4 的分数尺度。 OBSR 吃的是 E8M0,纯 2 的幂可以直接加进指数。NVFP4 用的是 16 元素一块、E4M3 分数尺度,整体套用会需要 OBSR 支撑不了的乘法器。论文的办法是把尺度拆成指数与尾数:s = 2^e × (1.m),2 的幂那一半照旧走 OBSR,分数那一半 µ = (1.m_a)(1.m_b) 是一个 8 位整数,折进 MFPE 内部的 FP4 点积——先把四条 lane 的量级加起来,再用一次 11×8 乘法乘 µ,最后并入 FP32 加数。按分配律这个折叠是精确的,不需要除法器,尺度级联仍是 E8M0 宽度。代价:同时支持 OCP MX 与 NVFP4 额外 +11.8% 面积、+7.3% 功耗;朴素做法要 +25.1%/+24.0%,逐 PE 反缩放要 +15.6%/+15.7%。

整数为主的边缘推理。 因为 INT 蹭的是 FP-2X 的槽位,同宽度只有 FP 一半速率。如果模型以整数为主,可以加一条独立的 INT 点积通路把整数吞吐翻倍,代价是每 PE 多 1.39 千平方微米(+10.3%)。这是个明确的取舍,而不是设计缺陷——论文没有藏。

八、批判:这些数字该怎么读

面积是 cell area,不是 die area。 3.27 mm² 是 signoff 单元面积,裸片是 2.40×2.40 = 5.76 mm²,核心利用率 59%。跨设计比较时这两个数会被混用,看到"3.27 mm²"要先问是哪个。

不含 SRAM、NoC、控制器。 论文明确说商用芯片的报告包含存储、控制、片上网络与内存控制器,直接比不合适,所以不与 TPU/Trainium/Dojo 比。这也意味着 0.5–4 TOPS 的绝对值不能拿去和任何商用加速器对比——它只是一颗 16×16 的算术阵列加布线。

功耗方法学是 RTL 级。 Cadence Joules + 后端寄生 + 门级 GEMM 波形,激励取自 Qwen2.5-7B prefill 的 post-RMSNorm 分布(不是均匀随机),报的是激活流窗口内的峰值稳态功耗,排除复位、权重预载和排空周期。这个口径对"稳态吞吐"合理,但会低估真实负载里格式切换、预载与空闲的代价。

基线是合成功率/面积等价物。 "同吞吐级联 FMA-PE" 是作者按同吞吐同延迟拼出来的对照,不是任何已流片的单格式 PE;它证明了 DPA 的结构优势,但不能直接换算成"某商用 PE 会小 4.5 倍"。

阵列太小,缩放结论靠推断。 16×16 只有 256 个 PE;论文说 OBSR 的增量开销按"每块 PE 行"重复,所以比例与阵列规模无关,128×128 时被固定成本(时钟树、全局信号)略微稀释。这个推理合理但没有 128×128 的实测。

精度实验的覆盖有限。 4 个模型最大 3B,上下文 74–430 token,没有长上下文;MXFP8 的 ULP 结论不能外推到 32K 以上、激活分布更极端的场景。作者自己也承认,大 tile 商用引擎(128×128)里"专用块归约通路"可能是刻意的精度优化选择,朴素基线正是那种组织。

没有公开 RTL。 我检索了 GitHub,没有 MFSA 的仓库,连它依赖的 TransDot 也没有公开实现(论文引用为 arXiv 2605.07245)。面积/功耗数字只能复述,无法在本地重跑综合。

九、给做低精度硬件与算子的人四条经验

1.多格式的边际成本,取决于"共享什么"。 共享乘法器与累加器、把差异压到指数处理和一个输出 mux,加三种 FP 格式只花 6.9%;一旦要加整数符号扩展和独立吞吐,立刻变成 15.4%。设计前先决定"哪些格式必须同速",这决定了要不要第二条通路。

2.块尺度存在哪里,决定 MX 贵不贵。 存在累加器指数里(OBSR)= +2.7% 面积;存在第二个累加器里 = +7.6%;存在每个 PE 的乘法器前 = 更贵。E8M0 是纯 2 的幂这件事,是整个技巧成立的前提;换成 E4M3 分数尺度,就得把尾数折进点积(+11.8%)。

3.格式切换不该冲刷流水。 南北向部分和级联恒为 FP32/INT32,格式选择只是一条旁带信号,切换时在飞的部分和不用排空。对编译器/运行时意味着:可以在同一张图上连续发不同精度的 GEMM tile,不必为每次切换付排空代价。

4.看这类论文先问三个数:cell 还是 die、含不含 SRAM/NoC、功耗是 RTL 估算还是流片实测。 三个都答清楚,数字才有可比性。

附:本地能验的部分

RTL 跑不了,但 OBSR 的数值机制和论文的算术是可以验的(脚本在 ~/papers/mfsa/verify_obsr.py):

指数域加等于精确的 2 的幂缩放:对 20 万个随机 float32、41 个平移量(−20 到 +20),"把指数位加 d"与 ldexp 的结果 41/41 组逐位一致。这证明 OBSR 那个"只加指数"的操作在数值上是精确的,不是近似。

OBSR 与朴素双累加器对比:200 组随机 MXFP4 点积(K=2048,块尺度 σ=1)200/200 逐位一致,与论文"MXFP4 逐位一致"的结论吻合;200 组随机 MXFP8 也是 200/200 一致。论文在真实激活上观察到 MXFP8 有少数 ULP 差异,我这里没复现出来——因为随机数据的 32 项块和恰好能被 FP32 精确表示,差异本就不该出现。这反而说明:论文那点 ULP 差异来自真实激活的指数分布,不是机制缺陷。

面积/能耗算术可复原:OBSR 2.7%/5.4% 对朴素 7.6%/16.8%,降幅正好 64.2%/67.5%;FP 六格式 +6.9%;INT 追加 +15.5%(论文 15.4%);3.27/2.60 = +25.8%(论文 25.7%)。

吞吐等比:0.512/1.024/2.048/4.096 TOPS ÷ 256 PE @1 GHz = 每 PE 2/4/8/16 GOPS,说明"等比缩放"不是宣传语而是表里的硬约束。

一句话总结这篇论文的价值:它把"多格式支持要花多少钱"从一句定性的"会很贵",变成了一张可以逐项对账的价目表——FP 格式 +6.9%,INT +15.4%,MX +1.8%,NVFP4 再 +11.8%。做架构评审时,这种表比任何峰值数字都有用。

相关学习资料