可变格式半精度浮点算法

一年半以前,我写了一篇关于“半精度”16位浮点运算的文章,硅藻土在fp16.我修复了一个bug,错误在fp16.这两篇文章都是关于fp16,定义在IEEE标准754。这只是15种可能的16位格式之一。在这篇文章中,我将考虑所有15个问题。

人们还对一种新的形式感兴趣,bfloat16.尼克·海厄姆(Nick Higham)在最近的一篇文章中对两者进行了比较,海厄姆在fp16和bfloat16上.Nick提到了英特尔、AMD、NVIDIA、Arm和谷歌对这两种格式的兴趣。这些格式是15种格式中的两种。

内容

格式

浮点格式由两个参数表示,p是分数的位数,q是指数的位数。对于半精度,我们总是有p+q = 15。这就为符号留下了一位。

最重要的两种格式是IEEE标准fp16p = 10和新的bfloat16p = 7。与标准格式相比,新格式的指数多了3位,分数少了3位。这种以牺牲精度为代价的范围扩大在机器学习和图像处理中被证明是有用的。

vfp16

我的新MATLAB®对象是一个阐述fp16,所以我给它起了名字vfp16.这是其帮助条目。

帮助@vfp16 / vfp16
vfp16。可变格式16位浮点对象的构造函数。Y = vfp16(x)是一个uint16的数组,大小与x相同。每个元素都包含p分数位、15-p指数位和一个符号位。精度的一个值p与整个数组关联。允许在0 <= p <= 15范围内任意p的整数值,尽管极值的效用值得怀疑。IEEE标准fp16的默认精度是p = 10。Y = vfp16(x,p)在不改变工作精度的情况下具有精度p。可以设置三个键值对:vfp16('precision',p)设置工作精度为p. vfp16('subnormals','on'/'off)控制逐步下流量。Vfp16 ('fma','off'/'on')控制混合乘加。 Up to three key-value pairs are allowed in a single call to vfp16. Two formats exist in hardware: vfp16('fp16') sets p = 10, subnormals = on, fma = off (the default). vfp16('bfloat16') sets p = 7, subnormals = off, fma = on. vfp16('precision') is the current working precision. vfp16('subnormals') is the current status of gradual underflow. vfp16('fma') is the current status of fused multiply adds. u = packed(y) is the uint16s in y. p = precision(y) is the value for the entire array y. See also: vfp16/single, http://blogs.mathworks.com/cleve/2019/01/16. Reference page in Doc Center doc vfp16

解剖学

可变格式半精度的关键属性如下图所示:vfp16_anatomy.极端的指数范围使得有必要使用vpa来计算的符号数学工具箱™vfp16_anatomy

  • p是精度,即分数的位数。
  • 偏见为指数的范围。
  • 每股收益1到下一个的距离是否更大vfp16号码。
  • 最大浮点数是最大的vfp16号码。
  • 最小正浮点数是最小的归一化vfp16号码。
  • 最小的是次法线吗vfp16号码。
vfp16_anatomy
P偏置eps realmax realmin tiny [1, 8191, 0.5, 8.181e2465, 3.667e-2466, 1.834e-2466] [2, 4095, 0.25, 9.138e1232, 3.83e-1233, 9.575e-1234] [3, 2047, 0.125, 3.03e616, 1.238e-616, 1.547e-617] [4, 1023, 0.0625, 1.742e308, 2.225e-308, 1.391e-309] [5, 511, 0.03125, 1.32e154, 2.983e-154, 9.323e-156] [6, 255, 0.01562, 1.149e77, 3.454e-77,5.398 e - 79] [e38 127, 0.007812, 3.39, 1.175 38吗,9.184 e-41] [e19 63, 0.003906, 1.841, 2.168 e-19 8.47 e-22][9日31日,0.001953、4.291 e9 9.313平台以及1.819 e-12] [10 15 0.0009766, 65500.0, 6.104 e-5 5.96 e-8][11日7日,0.0004883,255.9,0.01562,7.629 e-6][12、3、0.0002441、16.0、0.25、6.104 e-5][13、1、0.0001221、4.0、1.0、0.0001221][14日0时,6.104e-5, 2.0, 2.0, 0.0001221] [15, NaN, 3.0552 -5, NaN, NaN]

例子

这是二进制显示vfp16 (x, p)作为p不同的x2点到4点之间。这与下面的动画计算器的输出相同。

格式紧凑的格式x = 10/3
x = 3.333333333333333
P = 0 and y = 0; / / x = 0流(% 5 d % 18年代\ np y)结束
0 0 100000000000001 1 0 0 100000000000 101 10000000000000 1 2 0 10000000000000 11 3 4 0 0 1000000000 10101 10000000000 1011 5 6 0 100000000 101011 7 0 100000000 1010101 8 0 1010101 100000000 9 0 0 100000 101010101 10000 1010101011 0 1000 1010101011 100 0 1010101011 13 0 10 1010101010101 14 0 1 1010101010101 15 0 101010101010101

输出中的上三角形是有偏指数字段,下三角形是分数。在p = 0没有一个分数和at的空间p = 15这里没有指数的空间。因此,这些格式不是很有用。

下面是将这些值转换回双精度时的结果。随着精度的增加,每一步误差就减少一半。的最后两个值p显示失败。重要的价值观p分别是7和10。

disp (' p y x y'stickline (vfp16(x, P) = 0, close, open, 1,0), colorred;流(' % 5 d % 18.13 f % 18.13 f \ n”p y、x - y)结束
p y x - y 0 4.0000000000000 -0.6666666666667 - 1 0.0833333333333 3.2500000000000 3.0000000000000 3.5000000000000 - -0.1666666666667 0.3333333333333 - 2 3 4 3.3437500000000 - -0.0104166666667 3.3125000000000 - 0.0208333333333 3.3750000000000 - -0.0416666666667 5 6 7 8 3.3281250000000 - 0.0052083333333 3.3359375000000 - -0.0026041666667 3.3320312500000 90.0013020833333 10 3.3339843750000 -0.0006510416667 11 3.3330078125000 0.0003255208333 12 3.3334960937500 -0.0001627604167 13 3.3332519531250 0.0000813802083 14 NaN NaN 15 2.6666259765625 0.6667073567708

转换为单

指数中有8位,新的bfloat16与标准相比有显著优势吗fp16当涉及到单精度和半精度的转换时。半精度单词的符号和指数字段与单精度相同,因此半精度单词只是单精度单词的前半部分。例如,

格式十六进制disp(单(pi));disp(包装(vfp16(π,7)))
4049身上40490

融合将添加

许多矩阵计算算法的核心常常涉及两个基本矢量运算之一,“点”和“daxpy”。让xy是长度的列向量n,让一个是一个标量。扩展的点积是

x ' * y +

所谓的初等向量运算,或“daxpy”表示“双精度a乘以x加y”是

* x + y

这两种循环都包含长度为n的乘法和加法循环。许多现代计算机体系结构已经融合了乘法和加法指令,即FMA,其中这个操作是一个单一指令。此外,乘法运算产生的结果是工作精度的两倍,而加法运算则具有更高的精度。的bfloat16规范包括菲利普-马萨。与我们的vfp16方法FMA可以关闭和开启。默认为关闭。

弱智者

我写了一篇关于浮点denormals几年前。在IEEE的修订版中,754个非标准被重命名为次标准。不管它们叫什么,它们都是相对罕见的,范围很大bfloat16,这样它们就可以被关闭。

的所有性质bfloat16可以得到的声明

vfp16 (“bfloat16”

这集精度= 7弱智者=了菲利普-马萨=对

可以使用以下命令恢复默认值

vfp16 (“fp16”

这集精度= 10弱智者上=菲利普-马萨=了

计算器

这个动画显示了我是如何添加的@vdp16我在博客中提到过的计算器半精密罗马数字.当选择单词大小为16的单选按钮时,将出现一个滑块,允许您选择精度。按钮标注为“16”,后面是精度。向上移动滑块会增加分数中的位数,从而增加精度,而向下移动滑块则会减少p和精度。

我可以创建一个变量格式的四分之一精度对象,但其他格式都没用。变量格式单精度和双精度对象有很多位,但除此之外几乎没有其他东西可以提供。

未完待续

我还没完呢。我还在将线性代数函数扩展到可变格式的过程中。我希望在几周内报道这个问题。与此同时,我会发布克利夫实验室的4.20版本就我目前所做的




发布与MATLAB®R2018b

|

评论

要留下评论,请点击在这里登录到您的MathWorks帐户或创建一个新帐户。