可变格式半精度浮点运算

一年半前,我写了一篇关于“半精度”16位浮点运算的文章,fp16上的Moler.之后我修复了一个bug,fp16中的Bug.两篇文章都是关于fp16,在IEEE标准754中定义。这只是15种可能的16位格式之一。在这篇文章中,我将考虑这15种方法。

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

内容

格式

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

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

vfp16

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

帮助@vfp16 / vfp16
vfp16。可变格式16位浮点对象的构造函数。Y = vfp16(x)是一个uint16s的数组,大小与x相同。每个元素都包含p个分数位、15个指数位和1个符号位。精度的单个值p与整个数组相关联。允许p在0 <= p <= 15范围内的任何整数值,尽管极值的效用值得怀疑。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, 9.834e -2466] [2,4095, 0.25, 9.138e1232, 3.138e -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.03125, 1.149e154, 3.454e- 154,9.323e -156] [7,127,0.007812, 3.39e38, 1.175e- 77,9.394e -79] [8,63,0.003906, 1.841e19, 2.161e19, 8.47e-22] [9,31,0.001953, 4.291e9, 9.313e-10,1.819e-12] [10,15,0.0009766, 65500.0, 6.104e- 5,5.96 e-8] [11,7,0.0004883, 255.9, 0.01562, 7.629e-6] [12,3,0.0002441, 16.0, 0.25, 6.104e-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.052e-5, NaN, NaN, NaN]

例子

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

格式紧凑的格式X = 10/3
X = 3.333333333333333
P = 0:15 y =二进制(vfp16(x, P));流(% 5 d % 18年代\ np y)结束
00 100000000000001 10 100000000000001 2 0 1000000000000 11 3 0 10000000000000 101 4 0 10000000000 1011 5 0 1000000000 10101 6 0 100000000 101011 7 0 10000000 1010101 8 0 1000000 10101011 9 0 100000 10101010101 100 10000 1010101010101 11 0 100 101010101010101 13 010 1010101010101 14 01 10000000000000 15 0 101010101010101

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

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

disp (' p y x-y'y = double(vfp16(x, P));流('%5d %18.13f %18.13f\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 5 3.3750000000000 - -0.0416666666667 3.3125000000000 - 0.0208333333333 6 -0.0026041666667 3.3359375000000 3.3281250000000 - 0.0052083333333 3.3437500000000 - -0.0104166666667 7 8 9 10 11 3.3339843750000 - -0.0006510416667 3.3330078125000 - 0.0003255208333 3.3320312500000 - 0.0013020833333 3.3334960937500 - -0.0001627604167 12 13 3.3332519531250 - 0.0000813802083 14楠楠15 2.6666259765625 0.6667073567708

转换为单一

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

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

融合正负相加

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

X '*y + a

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

A *x + y

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

弱智者

我写了一篇关于浮点无法线几年前。在IEEE 754的修订中,无法线被重命名为亚法线。不管它们叫什么,它们都是相对罕见的,因为它们的种类很多bfloat16,这样它们就可以被关闭。

所有的属性bfloat16可以得到与陈述

vfp16 (“bfloat16”

这集精度= 7次法线=关闭而且接通

可以恢复默认值

vfp16 (“fp16”

这集精度= 10亚法线=开启而且Fma = off

计算器

这个动画展示了我如何添加@vdp16我在博客中提到的计算器半精密而且罗马数字.当选择单词大小为16的单选按钮时,将出现一个滑块,允许您选择精度。按钮被标记为“16”,后面是精度。向上移动滑块会增加分数中的比特数,从而提高精度,而向下移动滑块则会降低精度p还有精确度。

我可以制作一个可变格式的四分之一精度对象,但没有其他格式是有用的。可变格式的单精度和双精度对象有很多比特,但几乎没有其他提供。

待续

我还没说完。我仍在将线性代数函数扩展为变量格式的过程中。我希望在几周内对此进行报告。与此同时,我会发帖克利夫实验室4.20版我目前所做的一切




发布与MATLAB®R2018b

|

댓글

댓글을남기려면링크를클릭하여MathWorks계정에로그하거나계정을새로만드십시오。