BF16和FP16对比分析
BF16和FP16对比分析
BF16和FP16是两种重要的16位浮点数格式,在深度学习和高性能计算领域有着广泛的应用。本文将对比分析这两种格式的位分配、精度和范围,并通过谐波级数求和的例子直观展示它们的差异。
BF16是对FP32单精度浮点数进行截断的数据格式,使用8位表示指数,7位表示小数。而FP16半精度浮点数则使用5位表示指数,10位表示小数。
与32位浮点数相比,采用BF16或FP16可以将吞吐量翻倍,内存需求减半。但是,这两者在精度上存在差异:BF16可以表示的整数范围更广泛,但尾数精度较小;FP16表示的整数范围较小,但尾数精度较高。
IEEE浮点运算标准在2008年的修订版中引入了半精度16位浮点格式(称为fp16)作为存储格式。各种制造商都采用了fp16进行计算,使用fp32(单精度)和fp64(双精度)格式规则的明显扩展。例如,NVIDIA P100和V100 GPU、AMD Radeon Instinct MI25 GPU以及为Fujitsu Post-K百万兆次级计算机提供动力的A64FX Arm处理器都支持fp16。
Bfloat16
Fp16在科学计算中具有有限范围的缺点,其最大正数为6.55×10^4。这导致了另一种16位格式的开发,该格式以精度换取范围。bfloat16格式被谷歌在其张量处理单元中使用。英特尔计划在其即将推出的Nervana神经网络处理器中支持bfloat16,最近(2018年11月)发布了一份白皮书,对该格式进行了精确定义。
下表显示了bfloat16、fp16和fp32的指数和有效位数的位分配,其中归一化数的隐式前导位计入有效数。
格式 | 指数位数 | 有效位数 |
---|---|---|
bfloat16 | 8 | 8 |
fp16 | 5 | 11 |
fp32 | 8 | 24 |
Bfloat16的有效位数比fp16少三个位,但指数多三个位。它具有与fp32相同的指数大小。因此,从fp32转换为bfloat16很容易:指数保持不变,有效数从24位四舍五入或截断为8;因此,在转换中不可能溢出和下溢。
另一方面,当我们从fp32转换为更窄的fp16格式时,溢出和下溢很容易发生,因此需要在转换前开发重新缩放的技术。
bfloat16的缺点是精度较低:基本上是3位有效的十进制数字,而fp16的精度为4。下表显示了三种格式的单位舍入u、最小正(次正规)数xmin、最小规范化正数xmin和最大有限数xmax。
格式 | 单位舍入u | 最小正数xmin | 最大有限数xmax |
---|---|---|---|
bfloat16 | 2^-7 | 2^-126 | 3.39×10^38 |
fp16 | 2^-10 | 2^-14 | 6.55×10^4 |
fp32 | 2^-23 | 2^-126 | 3.40×10^38 |
Harmonic Series
比较这些不同精度的一个有趣方法是求和调波级数1+1/2+1/3+⋯。序列发散,但是当在浮点运算中以自然顺序求和时,它会收敛,因为部分和增长而加法减少,最终加法足够小,以至于它不会改变部分和。下表显示了不同精度的谐波级数的计算总和,以及在总和变为常数之前添加的项数。