理解 RISC-V 中的浮点支持:从标量到向量扩展
RISC-V 架构以其模块化而闻名,允许实现者仅包含其特定目标工作负载所需的功能。这种理念在其对浮点(FP)算术的处理中表现得最为明显。与许多单片 ISA 不同,RISC-V 基础 ISA(RV32I 或 RV64I)不包含浮点指令;相反,它提供了一个丰富的扩展生态系统,可以根据应用的精度和性能需求进行分层。
这种模块化使开发者能够从使用软浮点库的微型嵌入式控制器扩展到利用宽幅向量寄存器和专用低精度格式的高性能计算(HPC)或 AI 加速器。
标量浮点架构
专用 vs. 统一寄存器文件
RISC-V 中最关键的架构决策之一是使用专用的浮点寄存器文件(FRF)。标准的 F 扩展引入了宽度为 FLEN 的 32 个寄存器。
与通用寄存器文件(XRF)的分离带来以下几个优势:
- 减少资源竞争: 浮点操作不会与整数操作争夺相同的架构存储。
- 灵活尺寸: 通用寄存器的宽度(XLEN)可以与浮点寄存器的宽度(FLEN)不同。例如,RV32 + D 配置使用 32 位整数寄存器但使用 64 位浮点寄存器。
- 简化分配: 当两种数据类型被隔离时,编译器可以更高效地分配寄存器。
然而,这也带来了成本:它需要专用的加载/存储指令以及在 FRF 和 XRF 之间的数据移动操作。
“In-X” 替代方案:Zfinx
为了减轻额外寄存器文件带来的硬件开销,RISC-V 提供了 Zfinx 系列扩展。这些扩展允许浮点操作直接从通用寄存器(XRF)进行操作。
- Zfinx 等价于 F 扩展(单精度)。
- Zdinx 对应 D 扩展(双精度)。
- Zhinx/Zhinxmin 对应半精度支持。
通过重用 XRF,实现者可以消除对浮点专用加载/存储的需求,尽管他们失去了独立寄存器压力和灵活尺寸的优势。
精度级别和 IEEE 754 合规性
RISC-V 主要遵循 IEEE 754-2008 标准,确保与 CPU 最广泛接受的算术标准兼容。
标准精度扩展
- F(单精度): 支持 binary32(FP32)。这是大多数其他 FP 扩展的基线。
- D(双精度): 支持 binary64。
- Q(四倍精度): 支持 binary128,尽管采用有限。
- Zfh / Zfhmin(半精度): 支持 binary16。Zfhmin 是一个最小子集,允许将 binary16 用作存储格式,将值提升到 binary32 以进行实际计算以节省硬件面积。
增强功能:Zfa
Zfa 扩展为标准格式添加了实用操作,包括浮点加载立即数(提供 32 个有用常量)、安静比较以及各种取整到整数的操作。
向量浮点和 AI 加速
基础向量支持通过 RVV 1.0 引入,为几乎所有标量指令提供向量变体。值得注意的是,向量乘累加指令是“破坏性”的,意味着一个操作数被覆盖作为目标以优化寄存器使用。
向低精度的转变
随着机器学习(ML)的爆炸式增长,对优先考虑吞吐量和能效而非极端精度的格式需求日益增长。
- BFloat16(BrainFloat16): 一个截断 binary32 的 16 位格式。RISC-V 通过 Zfbfmin(标量)和 Zvfbfmin/Zvfbfwma(向量)支持此格式。一个更全面的扩展 Zvfbfa 目前正在开发中,以提供几乎完整的 BFloat16 向量支持。
- OFP8 和 OFP4: 为了进一步降低内存带宽,RISC-V 正在探索 Open Compute 的 8 位(Zvfofp8min)和 4 位(Zvfofp4min)浮点格式。
- Micro-scaling(MX): 基于 OpenCompute MX 缩放格式,此方法通过共享缩放因子存储一块值,显著减少表示张量所需的总位数。
未来展望与挑战
随着 RISC-V 的扩展,它面临着竞争标准的挑战。虽然 Open Compute 项目(OCP)提供了一小套聚焦的格式,但 IEEE P3109 工作正在创建一个广泛的框架,以容纳数百种可能的小格式。RISC-V 可能需要定义特定的配置文件以防止生态系统碎片化。
社区视角
"从旁观者的 POV 来看,记忆多种不同扩展的所有混乱内容过于困难。命名风格并不能减轻这项任务。"
此外,业界仍在讨论完全替代 IEEE 754 的方案,例如 Posits,旨在解决浮点表示中的根本缺陷,尽管 IEEE 兼容性仍然是业界的当务之急。
关键扩展汇总
| Extension | Purpose | Register File |
|---|---|---|
| F | 单精度 (FP32) | 专用 (FRF) |
| D | 双精度 (FP64) | 专用 (FRF) |
| Zfinx | 单精度 (FP32) | 通用 (XRF) |
| Zfh | 半精度 (FP16) | 专用 (FRF) |
| Zvfbfmin | BFloat16 (向量) | 向量寄存器 |
| Zve32f | 向量单精度 | 向量寄存器 |