仅作记录学习使用,侵删
原文Beating Floating Point at its Own Game: Posit Arithmetic
参考翻译Posit: 替换IEE754的新方式 | SIGARCH
摘要
IEEE标准754浮点数(浮点数)的直接接点替换
Posit的优势
· 不需要区间算术或可变大小操作数
· 如果答案不精确,它们就会四舍五入
· 与浮点数相比,它们提供了引人注目的优势:更大的动态范围、更高的精度、更好的闭包、跨系统的逐位相同的结果、更简单的硬件和更简单的异常处理
· 永远不会溢出到无穷大或逐步下溢到零
· NaN表示一个动作而不是一个位模式
· 位置处理单元比IEEE浮点FPU需要更少的电路
· 由于较低的功耗和较小的硅占用,芯片支持的每秒定位操作POPS可以显著高于使用类似硬件资源的失败
· 对于GPU加速器和深度学习处理器,它可以在每瓦特和每美元做更多的计算,又能提供卓越的答案质量
与float对比
低精度的posits提供了一个比试图容忍答案质量下降的“近似计算”更好的解决方案。高精度posits比相同大小的浮点提供更正确的小数;在某些情况下,32位posits可以安全地取代64位浮点。换句话说,posits在他们浮点自己的领域击败它。
关键词
计算机算术,节能计算,浮点数,posits,线性包,线性代数,神经网络,unum计算,有效算术
背景:Type I and Type II Unums
unum算术框架有几种形式。原始的“类型I型”unum是IEEE 754标准浮点格式的超集;它在分数的末尾使用一个“ubit”来表示实数是精确的浮点还是位于相邻浮点之间的开放区间。符号、指数和分数位字段的定义来自IEEE 754,而指数和分数字段的长度会自动变化,从一个位到用户设置的某个最大值。类型I的unums提供了一种表示区间算法的紧凑方法,但它们的可变长度需要额外的管理。它们可以通过显式的舍入函数复制IEEE浮点行为。
“类型II”unum放弃了与IEEE浮点体的兼容性,允许基于投影实数的干净的数学设计。关键的观察结果是,有符号整数优雅地映射到射影实数,其正数与负数的包络线相同,顺序相同。
5位II型单元的结构如图1所示:
每个unum有n位,“u格”用 2^(n−3)−1实数xi填充圆的右上象限。 (不一定是合理的)
左上象限是xi的负数,一个围绕垂直轴的反射
圆的下半部分的上半部分是数字的倒数,这是一个围绕水平轴的反射,使得×和÷的操作就像+和−一样对称
与类型I一样,以1结束的类型II unum(ubit)表示相邻精确点之间的开放间隔,也是以0结束的unum。
类型II的unums有许多理想的数学属性,但对于大多数操作都依赖于表查找。如果它们有n位精度,那么(在最坏的情况下)2个参数函数有2^2n个表项,尽管对称性和其他技巧通常会将其减少到更易于管理的大小。对于当前的内存技术,表的大小将这种超快格式的可伸缩性限制在大约20位或更少。II型单元也不太容易进行融合操作。这些缺点促使人们寻找一种格式,这种格式将保留II型的许多优点,但要“硬件友好”,也就是说,使用现有的类浮动逻辑可计算。
Posits and Valids
我们对比了两种涉及实数的计算美学:
· 不严格,但便宜,快速和对于一套已建立的应用程序“足够好”
· 严格的和数学上的,甚至以更多的执行时间和存储空间为代价
第一个美学长期以来一直通过浮动运算来解决,即允许舍入误差,而第二个美学则通过区间运算来解决。
但是,如果我们总是在每次操作后使用“猜测”函数进行舍入,我们最好使用最后一个位作为另一个重要的分数位,而不是ubit。
II型整数的硬件友好版本放宽了其中一条规则:互反只遵循0、±∞和整数幂为2的完美反射规则。这让我们可以以一种保持有限数浮动的方式填充超格,因为它们都是m⋅2^k的形式,其中k和m是整数。没有开放的时间间隔。
有效的是一对大小的假定,每个以ubit结束。它们用于应用程序需要间隔类型边界的严谨性的地方,例如在调试数值算法时。有效算法比传统的区间算法更强大,也不太容易快速扩展,使边界过于悲观的。然而,它们并不是本文的重点。
Posit格式(重点内容)
这是具有es指数位的n位posit表示的结构(图2)
符号位是我们所习惯的方法:0表示正数,1表示负数。如果为负值,则在状态位、指数和分数之前取2进制的补码。(比IEEE单精度浮点数多了状态码)
我们把这些领先的位称为数字的状态。二进制字符串以一行中全部0或全部1位开始,当下一位相反时终止,或者达到字符串的结尾。对于相同的位r,机制位以琥珀色编码,对于终止运行的相反位¯r,如果有的话。设m是运行中相同位的数量;如果这些位是0,那么k=−m;如果它们是1,那么k = m−1。大多数处理器可以在硬件中“找到前1”或“找到前0”,所以状态位的解码逻辑是很容易获得的。
该机制表示使用useedk的比例因子,其中使用了useed= 2^ 2es。表2显示了useedk的示例。
下一个位(颜色编码为蓝色)是指数e,被认为是一个无符号整数。没有像浮点数一样存在偏差。
它们代表2e的缩放。
可以有es指数位,这取决于状态的右边剩下多少位。
这是一种表达锥形精度的紧凑方法;接近1量级的数字比极大或极小的数字具有更高的精度,这在计算中很不常见。
如果在状态和指数位之后还有任何位,它们表示分数f,就像分数1一样。浮动中的f,隐藏位总是1。没有隐藏位为0的次正态数,因为有浮点数。
刚才描述的系统是填充u型晶格的自然结果。
从一个简单的3位posit开始;为了清晰起见,图3只显示了投影实数的右半部分。到目前为止,图3遵循了第II类规则。只有两个定位异常值:0(所有0位)和±∞(1后跟所有0位),并且它们的位字符串含义不遵循位置符号。对于图3中的其他假设,位采用如上所述的颜色编码。请注意,图3中的正值正好用于该状态所表示的k值的幂。
通过附加位来提高定位精度,当附加一个0位时,值将保持在圆上的位置。附加一个1位会在圆圈上的两个posit之间创建一个新的值。
我们应该给每个中间值分配什么值?设maxpos是最大的正值,minpos是由位串定义的环上的最小正值。在图3中,使用了maxpos和minpos。插值规则如下:在最大值和±∞之间,新值是最大值;在0和×之间,新值是小值/使用(新状态位)。在现有的值x = 2m和y = 2n之间,其中m和n相差大于1,新的值是它们的几何平均值,√x⋅y=2(m+n)/2(新的指数位)。否则,新值位于它旁边现有的x和y值之间,也就是说,它表示算术平均值(x+y)/2(新的分数位)。
例如,图4显示了es=2时从3位到5位位置的构建,因此使用了useed= 16:
如果在图4中再附加一个位来进行6位假设,那么表示在1/16和16之间的值范围的假设将附加分数位,而不是指数位。
假设我们将一个假设p的位字符串视为一个有符号的整数,范围从−2n−1到2n−1−1。设k为由状态位表示的整数,e为由指数位表示的无符号整数。
如果分数位的集合是{f1f2 … ffs},可能是空集,设f是由1.f1f2 … ff表示的值。
(换算公式,重要)
状态和es位是标准浮点数中指数位的函数;他们一起设置了分数的2次幂缩放,其中每个使用的增量是2es位的批移。
最大值使用useedn−2,最小值使用useed2−n。图5中显示了一个假设解码的示例(为了清晰起见,这里的es有一个“非标准”值)。
符号位0表示该值为正。状态位0001有3个0秒,这意味着k是−3;因此,由状态为贡献的比例因子是256−3。
其他的比较简单,看图就可以理解,这里就不再过多赘述。
8位Posit和神经网络训练
虽然IEEE浮点没有定义“四分之一精度”的8位浮点,但es = 0的8位posit被证明对某些方面非常有用;它们足够强大来训练神经网络。
目前,半精度(16位)IEEE浮点数经常用于这一目的,但8位假设有可能更快2−4×。
神经网络训练的一个重要函数是sigmoid函数。如图六绿色曲线
一个常见的sigmoid函数是1/(1 + e−x),它计算起来很昂贵,很容易需要超过100个时钟周期。因为数学库被调用来计算exp(x),而且还要计算除法。
使用posit,可以简单地翻转x的位置的第一位,向右移动两位(左侧移动0位),图6中得到的posit函数(用洋红色显示)非常接近1/(1 + e−x)(用绿色表示);它甚至有与y轴相交的正确斜率。
使用Useed来匹配或超过浮动点的动态范围
我们将一个数字系统的动态范围定义为从最小到最大的正有限值的几十年数,从小值到极大值。也就是说,动态范围被定义为log10(maxpos)−log10(minpos)=log10(maxpos/minpos)。对于具有es = 0的8位定位系统,minpos为1/64,maxpos是64,所以动态范围约为36年。用es = 0定义的Posits优雅而简单,但它们的16位和更大版本的动态范围比相同大小的IEEE浮子要小。
例如,一个32位IEEE浮点点的动态范围约为83年,但一个具有es = 0的32位位置将只有大约180年的动态范围。
这里是一个es值表,它允许假设超过16位和32位大小的浮点数的动态范围,并与64位、128位和256位的大小紧密匹配。
选择es = 3作为32位posit的一个原因是,它不仅可以更容易地替换32位浮点数,还可以替换64位浮点数。类似地,170年的16位posit的动态范围将它们开放给目前仅用32位浮点数处理的应用程序。我们将证明,posit可以超过具有相同位宽的浮点数的动态范围和精度。
Float与Posit格式的定量比较
没有用posit表示的“NaN”;相反,计算被中断,中断处理程序可以设置为报告错误及其原因,或调用解决方案并继续计算,但是posit不会使将一个数字分配给根据定义不是数字的东西的逻辑错误。这大大简化了硬件。如果程序员发现需要使用NaN值,则表示程序还没有完成,并且应该将有效值的使用作为一种数值调试环境来调用,以查找和消除此类输出的可能来源。类似地,posit缺乏一个单独的像float一样的∞和−∞的表示;然而,有效支持开放间隔(maxpos,∞)和(−∞,−maxpos),它们提供了表达任何一个符号的无限结果的能力,因此对符号无穷的需要再次表明需要有效而不是posit。
在posit表示中没有“负零”;“负零”是对IEEE浮点数中存在的数学逻辑的另一种挑战。在posit中,当a = b,f (a) = f (b).IEEE 754标准说,“负零”的倒数是−∞,而“正零”的倒数是∞,但也说,负零等于正零。因此,浮点数意味着−∞=∞。
float有一个复杂的平等测试,判断a 是否等于 b这个判断,在a或b中存在NaN时,即使位模式相同,结果也始终是假的。如果位模式不同,a仍然有可能等于b,因为负0等于正零!对于posit,相等式检验与比较两个整数完全相同:如果位是相同的,则它们是相等的。如果有什么不同的地方,则它们不相等。posit与有符号整数具有相同的a<b关系;和有符号整数一样,你必须小心一切,但是如果你已经是有符号整数,在posit中你真的不需要单独的机器指令来进行位置比较。
在posit格式中没有异常数,即特殊的位模式表示隐藏的位是0而不是1。posit不使用“逐步下溢”。相反,他们使用了锥形的精度,这提供了逐步下溢的功能和一个对称的标准,逐渐溢出的功能。(浮点数不是逐渐溢出的,而是不对称的,并使用这些位模式来获得大量的、未使用的NaN值。)
对于硬件设计者来说,float有一个优势:指数的位的固定位置和分数意味着它们可以并行解码。而在posit中,在其他位被解码之前确定状态位有一点序列化。在处理器设计中有一个简单的解决方案,类似于用于加速float异常处理的技巧:一些额外的寄存器位可以附加到每个值,以节省在解码指令时提取大小信息的需要。