一种单精度浮点倒数开方运算的硬件实现

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

一种单精度浮点倒数开方运算的硬件实现
作者:焦永
来源:《电脑知识与技术》2013年第09期
摘要:单精度浮点倒数开方运算在GPU设计中经常会用到。

实现这种运算一般有两种方法,迭代法和查表法。

迭代法要根据精度要求确定迭代次数,只需要很小的存储器保存迭代初值,但需要的运算器数量较多。

查表法根据输入的数据直接从ROM中查表得到结果,需要占用的存储资源比较多。

该文提出了一种间接查表法实现的浮点倒数开方运算实现方法,将迭代法和直接查表法的优点结合起来。

经过理论推导和硬件仿真验证,该算法能够满足单精度浮点数的运算精度。

关键词:单精度浮点;倒数开方;查表
中图分类号:TP312 文献标识码:A 文章编号:1009-3044(2013)09-2242-04
单精度浮点倒数开方运算在GPU设计中经常会用到。

在硬件设计中一般有两种实现方法,一种是采用迭代法,比较著名的是牛顿-辛普森迭代法;另一种方法是查表法。

两种方法各有优缺点:迭代法需要的存储资源比较小,但是要达到单精度浮点数的精度要求,需要进行多级迭代,所耗费的运算资源比较大;而查表法不需要运算资源,但是需要占用的存储器资源数量会比较大。

所以结合这两种实现方法的优缺点,该文实现了一种间接查表法,利用泰勒级数展开,取出适当的位数位数进行查表,然后再进行运算得出满足精度要求的结果,在存储资源和运算资源方面进行了平衡。

1 IEEE 754单精度浮点数据格式
IEEE754标准定义了单精度32位和双精度64位浮点数的格式。

32位IEEE754单精度标准值中,第一位是符号位,其后8位用来存放指数,最后23位用来存放小数尾数,如表1所示。

表 1 单精度32位浮点数格式
在IEEE754单精度浮点标准中,明确包含了符号位,第32位用作符号位。

尾数进行了归一化,以产生一个1.f格式的数,f是小数部分,占用分配的23位。

因为规格化的数最左一位总是1,所以不需要存储该位,在该格式中它是隐式的。

这样一个n位的尾数实际上存放了一个n+1位数。

为使尾数规格化,指数被适当增减,来跟踪规格化所需的左右移位数以及小数点。

2 单精度浮点倒数开方算法
设x为单精度浮点数,计算[1x]的算法有迭代法、直接查表法和间接查表法。

先不考虑指数的计算,只考虑尾数的倒数开方。

(指数的计算在间接查表法中一并介绍)
2.1 迭代法
牛顿迭代法的迭代公式:
迭代法的收敛速度定义为:
则称序列[xn]p阶收敛,如果序列[xn]是由迭代公式[xn+1=Φxn]产生的,且p阶收敛,则称这种迭代过程是P阶收敛的。

当定义域为[1,4)时,上式可转化为对尾数的整数运算。

注:定义域为[1,4)的说明:对于任一个浮点数而言,其尾数都在[1,2)内,但由于开方时需要将阶数除以2,因此尾数的范围需要放大为2倍或缩小一半。

实验表明,放大至[1,4)效果更好。

为了加快收敛速度,按照如下方法确定迭代的初值:由于这里计算倒数时定义域为[1,4),因此把x轴上的区间[1,4)分成N段,每一段取中点的倒数开方值作为落在此段的x的迭代初值。

当分为32份时,则浮点数的尾数部分的前4位即可作为分段的序号。

试验表明,分成32段的情况下,迭代n步得到结果的情况如下:
2.2 直接查表法
直接查表法比较简单,根据浮点数的尾数,构造ROM表,若直接根据输入数据查ROM 得到结果,总共需要223×32(bit)的存储空间(即32MB),这在硬件实现时是基本不可能的。

2.3 间接查表法
将上述两种方法的优点结合起来,我们就会很自然的得到一种间接查表法。

关键问题是ROM表如何设计。

2.3.1 指数的计算。

由浮点数格式可知:
因此,在保证24位精度的前提下,应把浮点数x的尾数的定义域[1,2]等分为[212=4096]份。

步骤1:把x规格化到[1,2)的范围内,保持该数的后23位尾数,前面用0x3f8替代,即:nval = 0x3f800000 | (nval & 0x7fffff);
步骤2:计算n值。

n就是[an]中刚好小于x的n值,也就是尾数的前12位。

于是:n = (nval & 0x7fffff) >> 11;
步骤3:计算h值、确定[An]、计算[an]-h。

注意到当x落在第一个小区间[1.0+14096,1.0+24096]时,即n==0时,[an]=0x3f800000,[2an-h]时会出现尾数溢出的情况。

所以这时使用公式(4)进行计算,其余情况使用公式(3)计算。

结论:计算2[an]-h时,注意到[an]和h的精度刚好是尾数中的前12位和后11位,因此这两个数的差值不需要按浮点数相减,只需要把它们按照32位整数值相减就可以了。

步骤4:计算[An](2[an]-h)。

使用浮点数乘法计算以上两数之积,得到的结果的后23位就是所要求的1/x的尾数。

得到尾数之后,再把x的符号位和1/x指数位合并到一起就得到了最后的1/x。

3 硬件实现
根据前面对算法的描述,将该算法的硬件实现结构如图2所示。

根据硬件实现结构,计算浮点倒数的模块需要的逻辑资源为:1个24位加法、1个24位乘法、1个4096×32(bit)=16KB的ROM。

将该算法用Verilog语言描述,生成一些随机测试激励在NC_Verilog环境下进行仿真,仿真波形如图3所示,其中输入数据、运行结果、实际结果和误差见表2所示。

由仿真结果可以看出,在硬件实现的计算结果与真实结果相比,误差都不会超过±1×2-24,能够满足单精度浮点数的精度要求。

4 结束语
为了实现一种运算逻辑与存储资源的平衡,该文提出了一种浮点倒数的间接查表算法。

通过理论证明,该算法能够保证单精度浮点数的运算精度。

将该算法用硬件实现,通过仿真进一步验证了算法的正确性。

参考文献:
[1] Nobuhiro Ide.2.44-GFLOPS 300-MHz Floating-Point Vector-Processing Unit for High-Performance 3-D Graphics Computing [J].IEEE JOURNAL OF SOLID-STATE CIRCUITS (JSSC),2000,35(7):1025-1033.
[2] Kim D H.A SoC with 1.3 Gtexels/s 3-D Graphics Full Pipeline for Consumer Applications[J].IEEE JOURNAL OF SOLID-STATE CIRCUITS,2006,41:71-78.
[3] E.Lindholm,et at.A User-Programmable Vertex Engine [C].ACM SIGGRAPH,2001:12-17.
[4] Ercegovac M D,Lang T.Digital Arithmetic[M].Morgan Kaufmann Publishers,2004:182-237.。

相关文档
最新文档