FP16,全稱半精度浮點數,是一種遵循IEEE 754標準的16位浮點數格式,其存儲格式為1位符號位、5位指數位和10位尾數位。該格式亦被稱為binary16。
與單精度(FP32)相比,FP16僅需一半的存儲空間和記憶體頻寬,在支持該數據類型的GPU(如搭載Tensor Core的英偉達GPU)上能實現更高的計算吞吐量,因而廣泛套用於深度學習訓練與推理、圖像處理等領域以提升性能。在硬體支持方面,Arm架構從Armv8.2-A開始引入FP16指令,而x86架構的AVX512_FP16指令集也為其提供了原生支持。
基本介紹
- 中文名:半精度浮點數
- 外文名:Half-Precision Floating-Point
- 別名:binary16
定義與標準,技術規格,優勢與套用,軟體與工具支持,深度學習框架支持,數學與仿真軟體支持,程式語言與編譯器支持,代碼生成工具支持,
定義與標準
FP16(Half-Precision Floating-Point)是一種16位(2位元組)的浮點數表示格式,通常被稱為半精度浮點數。它遵循IEEE 754標準(特別是IEEE 754-2008版本),在該標準中亦被稱作binary16。其內部數據結構劃分為:1位符號位(s)、5位偏置指數位(e)和10位尾數位(f)。
技術規格
FP16遵循IEEE 754標準,是一種16位浮點數格式,其16位字被劃分為1位符號位、5位指數位和10位尾數位。該格式可表示的最大正值約為±65504(約6.5×10),最小正值約為5.96×10(非規格化數)或約6.1×10(規格化數)。其指數偏置為15,精度約為2(約10),能表示約3位十進制有效數字。
FP16使用16位存儲,比使用32位的單精度和使用64位的雙精度需要更少記憶體,但其表示精度也低於單精度和雙精度。與腦浮點數相比,FP16擁有更長的尾數位,能提供更好的有效位長度和精度,而BF16則擁有更長的指數位,能提供更廣的動態範圍。
優勢與套用
FP16(半精度浮點數)因其16位的存儲格式,在記憶體占用和計算效率上相比更高精度的浮點格式(如FP32)具有顯著優勢,同時其浮點表示法又提供了比同尺寸定點數或整數更寬的動態範圍,使其在特定計算密集型領域得到廣泛套用。
首先,FP16數據占用的存儲空間僅為FP32的一半,這直接降低了記憶體頻寬需求和存儲開銷。在存儲大規模參數或數據時,能有效減少記憶體占用。
其次,在支持FP16原生運算的硬體上,其計算吞吐量遠高於FP32。例如,在配備Tensor Core的NVIDIA GPU上,FP16的矩陣乘和卷積運算吞吐量可達FP32的8倍。此外,在ARM架構的CPU及FPGA上,使用FP16也能帶來顯著的性能提升或面積/功耗最佳化。
軟體與工具支持
FP16作為一種數據類型,在各類軟體和工具中獲得了廣泛的支持,這些支持主要體現在深度學習框架、科學計算軟體、程式語言及編譯器、以及代碼生成工具中,旨在幫助開發者利用FP16節省記憶體、提升計算性能。
深度學習框架支持
PyTorch通過AMP(Automatic Mixed Precision)庫以及APEX庫提供對半精度float16的支持。TensorFlow等主流框架也支持FP16及混合精度訓練,這些工具通過自動混合精度訓練幫助開發者利用FP16加速模型訓練與推理。
數學與仿真軟體支持
MATLAB和Simulink廣泛支持FP16數據類型,其許多函式和模組支持該類型,並可用於仿真。
程式語言與編譯器支持
在C/C++中,GCC編譯器通過_Float16類型支持半精度浮點,在x86目標上,可通過-mavx512fp16編譯選項生成AVX512-FP16硬體指令,否則進行軟體仿真。Go語言通過x448/float16庫提供符合IEEE 754標準的FP16支持,該庫經過充分測試並可用於生產環境。Rust提供了半精度浮點類型f16和bf16的支持。JavaScript/ECMAScript在ES2025有關於float16的提案。
