了解 RISC‑V 浮點支援:從標量到向量擴充
RISC-V 架構以其模組化聞名,允許實作者僅加入特定目標工作負載所需的功能。這種理念在浮點(FP)算術的處理方式上表現得尤為明顯。與許多單一體系的指令集架構不同,RISC-V 基礎指令集(RV32I 或 RV64I)不包含任何浮點指令;相反地,它提供了豐富的擴充生態系統,可依應用的精度與效能需求層層堆疊。
這種模組化使開發者能夠從使用軟體浮點函式庫的微型嵌入式控制器,擴展到使用寬向量暫存器與專門低精度格式的高效能運算(HPC)或 AI 加速器。
標量浮點架構
專用與統一暫存器檔案
RISC-V 中最關鍵的架構決策之一是使用專用的浮點暫存器檔案(FRF)。標準 F 擴充引入了 32 個寬度為 FLEN 的暫存器。
這種與通用暫存器檔案(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)。這是大多數其他浮點擴充的基礎。
- 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,以提供幾乎完整的向量支援。
- OFP8 與 OFP4: 為進一步降低記憶體頻寬,RISC‑V 正在探索 Open Compute 的 8 位元(Zvfofp8min)與 4 位元(Zvfofp4min)浮點格式。
- 微縮放(MX): 基於 OpenCompute MX 縮放格式,此方法以共享的縮放因子儲存一組值,顯著減少表示張量所需的總位元數。
未來展望與挑戰
隨著 RISC‑V 的擴展,它面臨與其他標準競爭的挑戰。雖然 Open Compute Project(OCP)提供了一小套聚焦的格式,IEEE P3109 計畫則在打造涵蓋數百種可能小格式的廣泛框架。RISC‑V 可能需要定義特定的配置檔,以防止生態系統碎片化。
社群觀點
RISC‑V 擴充命名慣例的複雜性以及龐大的選項數量令人望而生畏。正如一位社群成員所指出的:
"從旁觀者的角度來看,要記住所有不同擴充的混亂實在過於困難。命名風格並未減輕這項任務。"
此外,仍在討論完全取代 IEEE 754 的替代方案,例如 Posits,其目標是解決浮點表示的根本缺陷,儘管 IEEE 相容性仍是業界的首要考量。
主要擴充摘要
| Extension | Purpose | Register File |
|---|---|---|
| F | 單精度 (FP32) | 專用 (FRF) |
| D | 雙精度 (FP64) | 專用 (FRF) |
| Zfinx | 單精度 (FP32) | 通用 (XRF) |
| Zfh | 半精度 (FP16) | 專用 (FRF) |
| Zvfbfmin | BFloat16(向量) | 向量暫存器 |
| Zve32f | 向量單精度 | 向量暫存器 |