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

更新时间:2024-03-29 作者:用户投稿原创标记本站原创 点赞:6144 浏览:19386

摘 要 :单精度浮点倒数开方运算在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.结束语

为了实现一种运算逻辑与存储资源的平衡,该文提出了一种浮点倒数的间接查表算法.通过理论证明,该算法能够保证单精度浮点数的运算精度.将该算法用硬件实现,通过仿真进一步验证了算法的正确性.