常见的浮点类型有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
sign | exponent (5 bit) | fraction (10 bit) | |||||||||||||
┃ | ┌─────────────┐ | ┌──────────────────────────────────┐ | |||||||||||||
0 | 0 | 1 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
15 | 14 | 10 | 9 | 0 |
sign | exponent (8 bit) | fraction (23 bit) | |||||||||||||||||||||||||||||
┃ | ┌─────────────────────────┐ | ┌───────────────────────────────────────────────────────────────────────────────┐ | |||||||||||||||||||||||||||||
0 | 0 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
31 | 30 | 23 | 22 | 0 |
sign | exponent (8 bit) | fraction (7 bit) | |||||||||||||
┃ | ┌─────────────────────────┐ | ┌───────────────────────┐ | |||||||||||||
0 | 0 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 |
15 | 14 | 7 | 6 | 0 |
sign | exponent (8 bit) | fraction (10 bit) | ||||||||||||||||
┃ | ┌─────────────────────┐ | ┌─────────────────────────┐ | ||||||||||||||||
0 | 0 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
18 | 17 | 10 | 9 | 0 |
sign | exponent (7 bit) | fraction (16 bit) | |||||||||||||||||||||
┃ | ┌───────────────────┐ | ┌─────────────────────────────────────┐ | |||||||||||||||||||||
0 | 0 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
23 | 22 | 16 | 15 | 0 |
sign | exponent (8 bit) | fraction (15 bit) | |||||||||||||||||||||
┃ | ┌─────────────────────┐ | ┌───────────────────────────────────┐ | |||||||||||||||||||||
0 | 0 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
23 | 22 | 15 | 14 | 0 |
Enflame's ef32
sign | exponent (8 bit) | fraction (11bit) | |||||||||||||||||
┃ | ┌───────────────────┐ | ┌───────────────────────────────┐ | |||||||||||||||||
0 | 0 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
19 | 18 | 11 | 10 | 0 |
更多参考文档:
- bfloat16 floating-point format - Wikipedia
- What is the TensorFloat-32 Precision Format? | NVIDIA Blog
- A100 Tensor Float 32 性能实测 - 知乎 (zhihu.com)