常見的浮點型別有fp16,fp32,bf16,tf32,fp24,pxr24,ef32,能表達的資料範圍主要看exponent,精度主要看fraction。
可以看出表達的資料範圍看fp32,bf16,tf32,pxr24和ef32都是一樣的,因為大家能表達的都是-2254~2255這個大概範圍。fp24到表達範圍比上面這些小,是-2126~2127
從精度上看fp32>pxr24>ef32>tf32>bf16,燧原的ef32都精度比Nvidia的fp32的精度多了一位,但都顯著優於google的bf16,燧原的ef32,Nvidia的tf32都是使用fp16的計算效能像fp32的表達範圍靠齊的一種嘗試。
之前看《Enflame 2.0 Whitepaper_Dorado》的時候,看到描述tf32是1+8+11,還和一位同事糾結了一下,後來才知道燧原白皮書裡面說的tf32其實是自己的ef32,並不是Nvidia的tf32,多設計一位精度最初是為了規避專利風險,後面也有精度和效能的折中考慮。
ef32總共20bits,而tf32是19bits,從硬體設計上說20bits的效能應該比19bits更好,當前也不排除Nvidia另外拿一個bit來作為奇偶校驗位之類的設計。
另外,AI中也有很多場合用定點資料,就是程式語言裡面說的整型,一般用INT8,類似C語言裡面的char和byte。
16-bit float
![](https://i.iter01.com/images/cb3777ab32681d54bcde9202179b70fc25eb3fd5eeaa6d5a5149f85ec4cf64d8.png)
32-bit float
![](https://i.iter01.com/images/dcc035a25a394db9015e95d410e97031e7999a67e6d573040240d4134a7ece7d.png)
bfloat16
NVidia's TensorFloat(tf32)
![](https://i.iter01.com/images/357c22f2f2244e947a08b42b012426f2fc0cf7eef0061f8073e91598a062f2c1.png)
AMD's fp24 format
![](https://i.iter01.com/images/ea945242b6dc72232ed31c0c0aad04c7a8fb7d825c657912554b9fbc929c860a.png)
Pixar's PXR24 format
Enflame's ef32
![](https://i.iter01.com/images/3a2b7dfb06f9b4137df4ead9436decded09c4bfed75b6adb40a9598a6bfeec58.png)
更多參考文件: