利用四输入点积电路计算三角函数的制作方法

文档序号:14725793发布日期:2018-06-19 07:03阅读:374来源:国知局

本申请要求提交于2016年4月28日,美国申请号为15141625的美国专利申请,以及提交于2017年4月3日,韩国申请号为10-2017-0043158的韩国专利申请的权益以及优先权,所述两个专利整体内容通过引用并入本申请。

技术领域

本发明涉及利用电子电路执行三角函数计算的系统和方法。



背景技术:

在传统计算机系统中,对三角函数执行如(a)利用简单数学运算(加、减、乘、除等)计算所述三角函数的一系列的计算机指令,或者(b)利用用于针对特定输入的一个自变量或者一组自变量的三角函数内插的查询表,或者(c)特定编程以计算三角函数的专属电路。所有的这些方法具有如下缺点,(a)因为三角函数的复杂而非常缓慢,(b)当其中查询表小的时候精度低,或需要很大的查询表以满足高精度,(c)在硅片上需要一块大的区域而在尺寸限制范围内无法实现。

计算三角函数的通用方法是定义三角计算电路,从而该三角计算电路利用比如sinPi(t)=sin(π*t),cosPi(t)=cos(π*t),tanPi(t)=tan(π*t)等来计算该函数,其中t是输入自变量。由于经常以弧度而非π的倍数来表示输入自变量,该函数的输入自变量必须换算为t=x/π,其中x是以弧度来表示的输入自变量。因此,计算该输入自变量需要额外的处理,既要占用处理时间或在硅片上需要空间。

本文公开的系统和方法提出一种用于计算输入自变量t=x/π的改进方案。



技术实现要素:

附图说明

为了方便理解本发明的优点,将通过参考附图中的特别实施例以提出上文中简要描述的本发明的更详尽的描述。应该理解这些附图描绘的仅仅是本发明的典型实施例,因此其并不应被解释为本发明范围的限制,本发明将通过利用附图而进行额外明确且具体地进行描述或解释,其中:

图1为根据本发明实施例的计算三角函数的分量框图;

图2A到2F为根据本发明一个实施例的利用四元素点积(Dp4)电路来计算t=x/π的方法的处理流程图;以及

图3为可执行本文公开电路的计算设备图。

具体实施例

应该容易理解本发明的分量,如在本文图中普遍描述和图解的,可安排并设计为多种不同的配置。因此,接下来的本发明实施例的更详细描述,如图中所示,并非旨在如同权利要求书一样来限制本发明的范围,而仅仅作为根据本发明此申请预期实施例的特定范例的表示。通过参考所述附图将更好理解本申请实施例,在所有附图中相似部分指定相似的附图标记。

根据本发明的实施例可以实施为装置、方法或者计算机程序产品。因此,本发明可利用的形式为完整的硬件实施例、软件实施例(包括固件、常驻软件、微程序等)、或者在本申请中均可普遍指代为“模块”或“系统”的软件和硬件这两方面结合的实施例。此外,本发明可利用的形式为在任何表达可实施的计算机程序产品的有形介质,该介质含有可实施的计算机可用程序编码。

可运用任何一个或多个计算机可用或计算机可读的介质的结合,包括非永久性介质。例如,计算机可读介质可包括一个或多个手提电脑磁盘、硬盘、随机存取存储器(RAM)设备、只读存储器(ROM)设备、可擦除可编程只读存储器(EPROM或者闪存)设备、便携式只读光盘(CDROM)、光存储设备、和磁存储设备。在所选实施例中,计算机可读介质可包括任何非永久介质,其可包含、存储、通讯、传播或者传输程序,以供指令执行系统、装置、或设备使用或者与其连接。

可以一种或多种程序语言的结合编写用以实现本发明操作的计算机程序代码,包括:面向对象的程序语言比如Java、Smalltalk、C++等,以及传统的可编程程序语言,比如“C”程序语言或者类似的程序语言。上述程序编码代码的执行,可整体以独立软件包在计算机系统中,在部分在与该计算机有一定距离的远程计算机上的独立硬件单元中,或者全部在远程计算机或服务器上进行。对于后者,所述远程计算机与所述计算机通过任何类型的网络连接,该网络连接包括局域网(LAN)或广域网(WAN),或者该连接可连接至外部电脑(例如,通过使用互联网服务提供商的英特网)。

以下将参考根据本发明实施例的方法、装置(系统)以及计算机程序产品的流程图和/或框图来对本发明进行描述。应理解所述流程图和/或框图中的每一个,以及所述流程图和/或框图的各种组合可由计算机程序指令或者代码来执行。这些计算机程序指令可提供给通用计算机、专用计算机的处理器或其他用于制造机器的可编程数据处理装置,由此通过计算机的处理器或者其他可编程数据处理装置执行指令,创建执行载明于所述流程图和/或框图的模块或多个模块中的函数/操作的方法。

这些计算机程序指令也可存储在可指挥计算机或其他可编程数据处理装置以特定方法执行操作的非永久性计算机介质中,使得存储在所述计算机可读介质中的所述指令可生产出包括有指令工具的产品,这些指令工具执行载明于这些流程图和/或框图的模块或多个模块中的函数/操作。

上述计算机程序指令也可以加载于计算机或其他可编程数据处理装置之上,以产生一系列待在计算机或者其他可编程装置上执行的可操作步骤,从而生成计算机可执行程序,使得计算机和其他可编程装置上执行的指令提供程序以实现载明于所述流程图和/或框图模块或多个模块中的函数/操作。

参见图1,许多现代计算系统包括执行计算点积的专用线路的通用处理器或者图像处理单元(GPU)。例如,四输入点积(Dp4)为通用执行电路。一个Dp4电路接收四个第一输入值(u1,u2,u3,u4)和四个第二输入值(v1,v2,v3,v4)。然后将这些输入值输入乘法器100a-100d并分别生成输出值Mul1、Mul2、Mul3、和Mul4。比如,将u1和v1输入乘法器100a,将输入值u2和v2输入乘法器100b,将输入值u3和v3输入乘法器100c,且将输入值u4和v4输入乘法器100d。每个乘法器100a-100d输出一个结果若其两个输入自变量。将其中两个乘法器100a、100b的输出值输入第一加法器102a,其生成输出值Adder12_0;将另外乘法器100c、100d的输出值输入第二加法器102b,其生成输出值Adder34_0。所述加法器102a、102b的输出值可进一步进行由标识出前导零的前导0和舍位级104、处理以,并确定所述加法器102a、102b的所述输出值的指数部分,以及对所述加法器102a、102b的所述输出值进行舍位以获得适当的小数部分的处理。

然后将前导0和舍位阶段104的输出值输入末级加法器级106。末级加法器级106(“AdderAll”)的输出值为第一输入自变量和第二输入自变量的点积。

如图1所显示的,为了使用Dp4电路100a-100b、102a-102b、104和106以计算输入自变量t=x/π,根据本文公开实施例的传统Dp4可添加其他分量。尤其地,可将1/π的表达式输入乘法器100a-100d作为第一自变量,且可将输入自变量x输入乘法器100a-100d之中作为第二自变量。尤其地,可1/π表达式的二进制位的不同节段分别作为自变量u1到u4进行输入,且第二输入自变量可定义为v1=v2=v3=v4=x。

自变量级108计算1/π表达式的输入为u1到u4的部分。自变量阶段108的操作可实现图2A中所示的部分或全部步骤。

移位级110,例如通过执行图2B到2E所示的部分或者全部步骤,调整乘法器100a-100d的输出值。加法器102a、102b的输出值也可由例如通过执行图2E的部分步骤的ad调整和符号级112进行调整。加法器106的输出值的符号可由例如通过执行图2F的方法的最终符号级114进行调整。

阶段108、110、112、114的操作结果用以根据(1)计算输入自变量t:

尤其地,阶段108、110、112、114的操作用以在浮点精度的范围内得到(1)的近似结果。此应用的目的在于,“近似计算”一个方程将意味着在用于代表方程的输出值的浮点格式10ULP(unit in last place最小单位)的范围内近似计算该方程的输出值。类似的,本文所示的例如数学函数的任何计算,可理解为公开浮点操作从而将数学函数在数学函数的输出值的浮点代表式的10ULP范围中进行近似计算。

(1)的动机在于避免在计算t=x/π时代表中间值的可用比特数有限而导致的误差。数字可由浮点值V表达,其包括三个部分:指数部分(expV),小数部分(mantissaV),和符号(signV)。在一些表达式中的任何浮点值V,可根据(2)利用这三部分进行近似,其中#BitsMantissaV是用于表达小数部分的比特数。

V=(signV!=1?1:-1)*2expV*(mantissaV/2)#BitsMantissav-1 (2)

SignV为二进制数并表示值V是否为负(1->负,0->非负)。ExpV为表示值V的进位制的整数,并且整数mantissaV是已知数的精确度。

在Dp4的一些实践中,四个乘法器100a-100d的每个均输出一个48比特的小数部分。加法器102a、102b输出72比特小数部分(Adder12_0、Adder34_0)然后舍位成48比特小数部分。由于在u1*v1+u2*v2中可能有比特对消,应该找到Adder12_0的前导0位置,并从前导0位置开始保留48比特小数部分。

末级加法器106获得均具有48比特小数部分的两个输入值以输出标准的32比特浮点值(23比特小数部分+在1之后的1比特)。

在乘法器100a-100d的浮动中,将浮点值划分为指数部分和小数部分。乘法器100a-100d的结果可作为新的小数部分=mantissaU1*mantissaV1(48比特)以及新的指数部分=exponentU1+exponentV1+1。

在计算三角函数Sin(x)、Cos(x)和Tan(x)时,如上所注明的,由于高精度SinPi(t)指令可行,以Sin(x)=SinPi(x/π)来计算上述函数。但是,在处理t=x/π时存在问题。如果|x|<2-126*π,t为非规格化数(小于2-126)。由于一些处理设备不支持非规格化数,该小数值将被看作零。因此,对于|x|<2-126*π,Sin(x)=SinPi(t)=0。因为正确值实际上与x非常接近,从而其相对误差为100%。另外一个问题是如何保证t=x/π的精度。当x非常大时(超过226),t=x/π的普通浮点计算仅能保留其整数部分,从而导致Sin(x)=SinPi(t)=0。其相对误差也是100%。

存在许多用来正确计算Sin(x)的方法。最有名的是“Payne和Hanek的约简法”(M.Payne和R.Hanek,“三角函数的弧度约简”,SIGNUM通讯,18:19-24,1983),此处其通过整体引用并入本公开。但是,为了直接执行这个方法需要许多指令。本文公开的实施例中,对传统Dp4电路进行修改以从(3)计算x的真实值。

数学上来说,对于这个公式,Sin(x)=Sin(π*t)=SinPi(t),且|t|≤0.5。但是,如果|x|<2-126*π,(3)的输出值为|x|/π的非规格化浮点值。为了正确处理这个情况,根据(4)来确定t:

当|t|<2.0时,将t输入SinPi()管道以计算SinPi(t);并当|t|>2.0时,对SinPi管道做出些许改变以返回t/2128(调整输入值的指数部分)。因此数学上来说,根据(1)确定t。

参考图2A到2F,所示的方法示出了变换Dp4电路的中间值和最终值的阶段108、110、112、114的函数,从而根据(1)输出t=x/π的近似值,进而即提高最终计算的准确度,又可利用许多计算系统中的常用电路。

具体参见图2A,可预定义值“Fraction_RCP_PI”并将其存储于执行方法2A的电路中,其中Fraction_RCP_PI为1/π的近似值。在一些实施例中Fraction_RCP_PI为216比特的值:

Fraction_RCP_PI[215:0]={0xa2f983_6e4e44_1529fc_2757d1_f534dd_c0db62_95993c_439041_fe5148}

图2A的方法包括根据x的值来选择Fraction_RCP_PI的一部分。例如,该方法可包括在200中从x获得指数部分(expX)以及在202中估算expX是否大于或等于25。如果expX不大于或等于25,则在204中将Fraction_EffectBits的值设为等于Fraction_RCP_PI[215:215-95],即,Fraction_RCP_PI的前96比特。如果expX大于或等于25,则在206中将Fraction_EffectBits的值设为等于Fraction_RCP_PI[215-expX+25:215-expX+25-95],即,96比特窗向右移动(较小有效位值)expX的超出25的数量。

Fraction_EffectBits的不同部分和x的小数部分(manX)输入乘法器100a-100c。具体地,Fraction_EffectBits可划分为高位值、中位值、低位1值和低位2值,其中高位high=Fraction_EffectBits[95:72],中位mid=Fraction_EffectBits[71:48],低位1low1=Fraction_EffectBits[47:24],低位2 low2=Fraction_EffectBits[23:0]。换言之,Fraction_EffectBits={high[23:0],mid[23:0],low1[23:0],low2[23:0]},其中{}代表级联。

如图2A所示,在208中乘法器100a-100d计算Mul1为manX*high;在210中计算Mul2为manX*mid;在212中计算Mul3为manX*low1;并在214中计算Mul4为manX*low2为的值。由于不同电路可执行各乘法器100a-100c,步骤208-214可平行进行。

在216中计算用于Mul1到Mul4中的Fraction_EffectBits的指数ExpOfFraction_EffectBits的值作为表达式(expX>=25)?-2+25-expX:-2的输出,其中(a?b:c)为三元运算符,其如果a为真true(1)则输出b,如果a为假false(0)则输出c。Fraction_EffectBits的各个部分(高位,中位,低位1,低位2)的指数部分(expHigh,expMid,expLow1,expLow2)在218-224中计算如下:

expHigh=ExpOfFraction_EffectBits

expMid=expHigh-24

expLow1=expHigh-48

expLow2=expHigh-72

如上,当自变量的小数部分相乘时,指数部分叠加。因而,对于每个乘法器输出的Mul1、Mul2、Mul3和Mul4,对应的指数部分将分别为expX+expHigh,expX+expMid,expX+expLow1,以及expX+expLow2。

参见图2B,可调整乘法器100a-100d的输出值(即,小数部分)以执行(1)并避免损失精度。

在步骤226中加法器102a接收Mul1和Mul2并输出两者的和。可移位处理Mul1和Mul2,使得它们不是简单地输入加法器102a中。例如,Mul1[47:0]和Mul2[47:24]可输入加法器102a之中。然后该加法器的输出值与Mul2[23:0]尾接连接以获得具有比特Bit[71:0]的Adder12_0的值。

在步骤228中,可计算expX’的值,其等于expX和25中的较大值。在230中如果发现expX’小于零,然后继续按照如下文描述的图2C进行处理。在232中如果发现expX’大于或等于2,则在步骤234中将Bit[71:73-expX’]设为零。

在236中如果发现expX’大于或者等于1,则在238中将Bit[72-expX’]设为等于(isSin?Bit[72-expX’]:Bit[72-expX’]^Bit[71-expX’]),其中如果接收到的操作码表示t将用作输入SinPi()的自变量则isSin为一。为了达到本公开的目的,符号“^”表示XOR(除开OR)操作。在236中如果发现expX’大于或者等于1,则在240中值FinalSign设为等于Bit[72-expX’],其中FinalSign用以按照下文描述来改变加法器106输出值的符号。类似的,在236中如果发现expX’大于或者等于1,则在242中将Bit[72-expX’]设为等于零。

在236中如果没有发现expX’大于或者等于1,且expX’不小于零,则在244中FinalSign设为等于(isSin?0:Bit[71])。

在另一个案例中,在246中输出FinalSign用于调整加法器106的输出且在248中将Bit[71-expX’]设为Bit[71-expX’]^isCos,其中isCos为接收到的操作码表示t用于计算CosPi(),尽管可通过调处执行SinPi(t)的电路的输出来获得CosPi()的近似值。在一些实施例中设置单独的标记,即,如果操作码表示将计算SinPi(t)则isSin可为1,否者则为0。标记isCos可设为等于NOT(isSin)。

参见图2C,在230中如果发现expX’小于零,则在250中FinalSign可设为零(没有符号变化)且在252中值S34From12设为零,值S34From12的值用于参见下文描述的图2E调整加法器102b输出值的符号。在254中进行前导0和舍位的识别,从而得到分别基于Adder12_0和expX’的具有小数部分和指数部分的新浮点值Adder12_1,其中Adder12_0和expX’已根据前导0在Adder12_0中的位置按照已知的现有技术进行调整。在256中Adder12_1可进一步设为等于(isSin?Adder12_1:-Adder12_1)。

如果在230中没有发现expX’小于零,则图2D中的步骤紧接着在图2B的步骤之后执行。具体地,如果在258中发现Bit[71-expX’]等于1,则S34From12设为等于Bit[71-expX’],且在262中Bit[71-expX’]设为等于Bit[71-expX’]的二进制补码。然后在264中输出S34From12并且在266中如步骤254所示的方式实现关于Adder12_0的前导零和舍位的识别以获得Adder12_1。

针对加法器102a的输出进行图2B到2D的处理。图2E的处理与图2B到2D的处理可平行进行以对加法器102b的输出进行处理。

在268中可将Mul3[47:0]和Mul4[47:24]输入加法器102b以计算值Adder34_0并将加法器102b的输出值与Mul4[23:0]=0,即零的24比特,相尾接。然后在270中按照如上的针对Adder12_0值的同样的方法来实现前导0和舍位的识别来针对Adder34_0计算Adder34_1的值。在272中如果发现S34From12为一,则改变Adder34_1的符号。在276中Adder34_1的值进一步设为等于((expX’<0&&isCos)?0.5:Adder34:0)。

参见图2F,然后在278中通过将如图2B到2E所示步骤的输出值Adder12_1和Adder34_1输入加法器106并接收AdderAll_0作为加法器106的输出值以计算AdderAll_0的值。在280中如果发现FinalSign为1,则改变AdderAll_0的符号。在其他情况下,AdderAll_0为输出值并用作三角函数电路,比如SinPi(t)、CosPi(t)、TanPi(t),或其他任何三角函数,的输入自变量t。具体地,当操作码为isSin,则将t输入到对应SinPi(t)的三角函数电路中。当操作码为isCos,则将t输入到对应CosPi(t)的三角函数电路中。其他操作码可调用t输入到其他三角函数。

输入自变量t(AdderAll_0)包括根据前导零和舍位步骤266、270确定的Adder12_1和Adder34_1的小数部分和指数部分而确定的小数部分(ManT)和指数部分(ExpT)。在一些实施例中,如果t&gt;=2,则在将t输入SinPi()之前将t设为等于t/(2128)。这是一个简单的操作且仅需要进行ExpT:ExpT=ExpT-128的运算。

下面将对可如何使用上述电路的解释和范例进行描述。

假设输入值为浮点格式x,其指数部分expX=exp(x),小数部分manX=man(x)。该方法包括保存1/π(exp of 1/πis-2)的分数的216比特。因此1/π=Fraction_rcp_pi[215:0]*2-218,Fraction_rcp_pi[215]=1。

如果Fraction_rcp_pi写成十六进制,则Fraction_rcp_pi[215:0]={0xa2f983_6e4e44_1529fc_2757d1_f534dd_c0db62_95993c_439041_fe5148}。则按照(2)Fraction_rcp_pi的指数部分=-2(最高有效位1表示0.25)。

然后基于expX的大小来选择Fraction_rcp_pi的96比特。数学上来说,x/π=manX*Fraction_rcp_pi[215:0]*2-218+expX-27。如果本步骤已完整地执行,则需要占用非常大区域的24x216比特整数乘法器。由于该结果仅保存上述分数的小数部分的24比特,则不需要如此大的乘法器。

当expX非常大的时候,x/pi将生成许多对于sin(x)的精度毫无作用的整数比特。因此对Fraction_rcp_pi的一部分选择如下:

Fraction_EffectBits[95:0]=(expX)≥25?Fraction_rcp_pi[215-expX+25:215-expX+25-95]:Fraction_rcp_pi[215:215-95]

从有效分数Fraction_EffectBits:{high[23:0],mid[23:0],low1[23:0],low2[23:0]}=Fraction_EffectBits[95:0]中选择高位、中位、低位1、低位2的值。

然后使用上述Dp4工具(图1)以计算manX*Fraction_EffectBits[95:0]如下:

manX*Fraction_EffectBits[95:0]=manX*high+manX*mid+manX*low1+manX*low2=mul1+mul2+mul3+mul4

ExpOfFranction_EffectBits=(expX)≥25?-2+25-expX:-2

expHigh=ExpOfFranction_EffectBits,expMid=expHigh-24,

expLow1=expHigh-48,and expLow2=expHigh-72

由于mul1+mul2不具有任何对消,Adder12_0输出72比特的小数部分(mantissaAdder12_0)和指数部分expAdder12_0=expHigh+expX+1。

当expX&gt;=25时,expAdder12_0=24,这意味着1的比特位于71-24=47。我们可去除mantissaExpAdder12_0[71:48](将其值设为零),其代表一些偶数整数数目的x/π。由于expMul1=expMul2+2,且在Dp4中仅使用48比特加法器,我们设mantissaAdder12_0[71:24]=(Mul1[47:0]&lt;&lt;24)+Mul2[47:24],并将Mul2[23:0]传递给mantissaAdder12_0[23:0]。

变量mantissaAdder12_0[47:47]是AdderAll的最终结果的符号比特。则FinalSign=mantissaAdder12_0[47:47],在设AddAll的符号比特信息之后,我们也将mantissaAdder12_0[47:47]设为零。

变量mantissaAdder12_0[46:46]表示与否,其决定是否应用等式(1)的第二行或第一行。因此,定义S34From12=mantissaExpAdder12_0[46:46],我们改变mantissaExpAdder12_0[46:0]如下:

mantissaAdder12_0[46:0]=mantissaAdder12_0[46:0]^S34From12+S34From12(5)

我们进一步输出S34From12作为Adder 34的符号位。当Adder12_0的二进制部分S34From12=1时,等式(5)处理并改变Adder34的符号从而进行减法计算。

在进行上述变化之后,我们将修改的Adder12_0输出至前导零和舍位步骤,以在舍位之后获得具有48比特精度的具有新expAdder12和mantissaAdder12的Adder12。Adder34_0到Adder34_1与之前Dp4进程一样,但是Adder34的符号位会改为S34From12。

当1≤expX&lt;25时,高位=Fraction_rcp_pi[215:215-23]。

定义expAdder12_0=expHigh+expX+1=expX-1。由于Adder12_0的1比特位置位于71-(expX-1)。对于expX≥25的处理,如果73-expX&lt;=71,我们将mantissaAdder12_0[71:73-expX]设为零。并将1位置比特mantissaAdder12_0[72-expX:72-expX]传递给AdderAll的符号。然后定义FinalSign=mantissaAdder12_0[72-expX:72-expX]。在设置AdderAll的符号位信息定义之后,我们将mantissaAdder12_0[72-expX:72-expX]设为零。S34From12=mantissaAdder12_0[71-expX:71-expX](1/2的位置),且我们得到:

mantissaAdder12_0[71-expX:0]=mantissaAdder12_0[71-expX:0]^S34From12+S34From12(6)

我们进一步输出S34From12作为Adder34的符号位。对于二进制补码的Adder12_0部分,当S34From12=1时公式(6)进行并改变Adder34的符号从而进行减法计算。

在做出上述变化之后,我们将修改后的Adder12_0输出给前导0和舍位步骤,以获得在舍位后具有48比特精度的新的expAdder12和mantisssaAdder12的Adder12_1。Adder34_0到Adder34_1如前Dp4的进程,但是Adder34_1的符号位会改变为S34From12。

当expX=0时,1/2的位置位于71(比特)。同样应用S34From12=Adder12_0[71:71]和公式(6)。将Adder12_0传递给前导0和舍位步骤,以获得在舍位后具有48比特精度的新的expAdder12和mantisssaAdder12的Adder12_1。

Adder34_0到Adder34_1与前Dp4的进程一样,但是Adder34的符号位可能变为S34From12。

当expX&lt;0,|x|&lt;1.0,时,1/2比特总为0。将Adder12_0传递给前导0和舍位步骤,以获得在舍位后具有48比特精度新的expAdder12和mantisssaAdder12的Adder12_1。Adder34_0到Adder34_1与前Dp4的进程一样。但是我们可截取Mul4的(最低有效位)LSB24比特。

尽管前导零计算看上去具有mantissaAdder12_0的71比特,但实际上,我们仅将mantissaAdder12_0[1/2’s pos-1:1/2’s_pos-48]的48比特放入前导零计算之中。对于所有单精度,在mantissaAdder12_0[1/2’s pos]之后最多具有32个零。

公式(6)可具有71比特定点加法器(如果S34From12=1,则在执行NOT之后+1)。由于mantissaAdder12_0=Fraction_rcp_pi[215:215-23]*manX=0xa2f983_6e4e44*manX,我们可进行一些简化。因为最多具有23+2LSB个零,所以我们只需要通过~MantissaAdder12_0[0,25]+1来计算LSB26比特,且我们仅需要进行~(NOT)操作来计算剩下的MSB(最高有效位)。将71比特二进制补码划分为26比特二进制补码和45比特NOT运算。

在前导零计算之后,我们仅保留具有48比特精度的mantissaAdder12。问题在于,48比特精度是否足够?由于如果(S34From12=1情况下)发生减法,Adder12可能与Adder34对消部分比特。由于mantissaAdder34[47,47]是与mantissaAdder12_0[23,23]对齐,只有当mantissaAdder12_0的前导零在比特23或24时才会发生对消。在两种情况下,我们均获得Adder12的全精度并保留其48比特的小数部分。

保留mantissaAdder34的48比特是可以接受的,尽管我们不能从理论上证明这个(理论上来说,mantissaAdder34的MSB的24比特可能被对消,从而仅剩下24比特精度)。但是,由于我们穷尽了所有浮点值,mantissaAdder34上可以对消的最大比特数目为8。这意味着我们在Adder12_1+Adder34_1之后保留至少40个有效比特。这意味着我们可对Adder12_0和Adder34_1使用32比特小数部分以获得具有24比特小数部分精度的AddAll。

利用上述电路的按照以下范例来计算Cos(x)=Sin(x+0.5π)=Sin(0.5π–x)。加上0.5π相当于在Adder12_0在1/2比特位上加1。当然我们需要确知1/2比特位。如果我们要在1/2比特位上加1,我们需要另一个定点加法器。在一些实施例中,我们仅根据以下情况计算S34From12,FinalSign:

表1.Cos(x)的FinalSign和S34From12

在计算Cos(x)时依然利用公式(5)。当0≤expX&lt;25时同样利用公式(6)。对于expX&lt;0,Cos(x)=Sin(0.5π–x)=SinPi(0.5–x/π),我们将Adder12的符号更改为负,并使得Adder34为0.5(expAdder34=-1,mantissaAdder34=1&lt;&lt;47)。然后由于我们在adder12具有48比特高精度,所以我们会在AdderAll获得具有足够精度的0.5-x/π。

以下范例将处理具有31比特的前导零的Sin(x)。本范例中假设X=0x67098498;(S=0,expX=79,manX=0x898498)并且定义Fraction_rcp_pi[215:0]={0xa2f983_6e4e44_1529fc_2757d1_f534dd_c0db62_95993c_439041_fe5148};

步骤1中根据函数Fraction_EffectBits[95:0]=(expX)≥25?Fraction_rcp_pi[215-expX+25:215-expX+25-95]:Fraction_rcp_pi[215:215-95]来选择96比特有效分数。我们向左移位Fraction_rcp_pi[215:0]79-25比特,然后得到高位96比特,所以Fraction_EffectBits[95:0]=4a7f09_d5f47d_4d3770_36d8a5。

由于我们向左移位Fraction_EffectBits 54比特,Fraction_EffectBits的指数部分为ExpOfFranction_EffectBits=-2-54(Fraction_rcp_pi的初始指数为-2)。

步骤2中利用Dp4工具来计算manX*Fraction_EffectBits[95:0]。首先我们设{high[23:0],mid[23:0],low1[23:0],low2[23:0]}=Fraction_EffectBits[95:0]。因此我们获得manX*Fraction_EffectBits[95:0]=manX*high+manX*mid+manX*low1+manX*low2=mul1+mul2+mul3+mul4。

在步骤2中所有乘法结果保留48比特小数部分,并且乘以四个指数如下:

exp_of_mul1=79+(-2-54)+1=24;mul1=0x280491_8d1158;

exp_of_mul2=exp_of_mul1-24;mul2=0x72eea7_fe9e38;

exp_of_mul3=exp_of_mul1-48;mul3=0x297aa9_5eaa80;以及

exp_of_mul4=exp_of_mul1-72;mul4=0x1d7658_92b5f8.

四个乘法结果可按照表2所示进行对齐。

表2、乘法结果对齐表

在步骤3中,我们使用两个平行加法器分别计算Adder12_0和Adder34_0。在这个步骤中我们使用72比特加法器计算Adder12=mul0+mul1。在一些实施例中,没有实际执行的72比特加法器。可替换地,Dp4工具可仅具有48比特加法器。因此按照Adder12_0[71:24]]=Mul1[47:0]+Mul2[47:24](LSB对准)来计算Adder12_0且将Adder12_0[23:0]定义为等于Mul2[23:0]。

在示范例中给出Adder12_0[71:0]=0x280491_FFFFFF_fe9e38。由于1的比特位位于47,我们定义高于47的比特为零,且将比特-47移动至最终符号,即,FinalSign=1,mantissaAdder12_0[71:0]=0x000000_7FFFFF_FE9E38,由于mantissaAdder12_0[46:46]=1,即,S34From12=1,并且mantissaAdder12_0[46:0]=(mantissaAdder12_0[46:0]^0x7FFFFF_FFFFFF)+1=0x000000_0161c8。

最后,我们执行前导0(31)的查询和舍位(本案例不需要舍位)。因此我们得到expAdder12=-31,mantissaAdder12=0xB0E400000000。

步骤3进一步包括获取Adder34_1,其包括根据未修改Dp4工具来执行处理。在一些实施例中将Adder34_0[47:0]设为等于Mul3[47:0]+Mul4[47:24](在最低有效位对齐)。简单地忽略Mul4[23:0]。

在这个范例中,给出Adder34_0[47:0]=0x297AA9_7C20D8,其中leading 0=2。因此如下规格化Adder34_0以获取Adder34_1:expAdder34=-24-2=-26,mantissaAdder34[47:0]=0x A5EAA5_F08360,signAdder34=S34From12=1。

在步骤4中,我们计算具有FinalSign的(Adder12+Adder34)。由于expAdder34=expAdder12+5,我们用1/32度量mantissaAdder12并后继进行加法计算。把Adder34的符号考虑为与Adder12的符号不同,我们得到

mantissaAdderAll=|0xB0E400000000/32-0x A5EAA5_F08360|=0xA06385_F08360,

expAdderAll=expAdder34–leading0(mantissaAdderAll)=-26,

以及

signAdder12=signAdder34^FinalSign=1^1=0

通过舍位,我们获得最终输出值t=0xA06386**。

如果我们移除隐藏的1,则获得十六进制表达式Hex(t)=0x32A06386。

图3为图解一个范例中计算设备300的框图。可使用计算设备300以执行比如本文中所讨论的各种程序。计算设备300可用作服务器、客户端、或其他计算实体。计算设备可包括执行本文公开的方法的电路,并可执行一个或多个应用程序,比如调用本文公开的方法以计算三角函数的应用程序。计算设备300可以是各种计算设备中的任意一种,比如台式电脑,笔记本电脑,服务器电脑,掌上电脑,平板电脑等。

计算设备300包括一个或多个处理器302,一个或多个存储器304,一个或多个界面306,一个或多个大容量存储器308,一个或多个输入/输出(I/O)设备310,以及显示设备330,全部上述设备与总线312相联接。处理器302包括可执行存储在存储设备304和/或大容量存储去308中的指令的一个或多个处理器或控制器。处理器302也可包括各种不同的计算机可读介质,比如高速缓存存储器。

存储设备304包括各种计算机可读介质,比如非永久性存储器(如,随机存储存储器(RAM)314)和/或永久性存储器(如,只读存储器(ROM)316)。存储设备304还包括可重写ROM,比如闪存。

大容量存储设备308包括各种计算机可读介质,比如磁带、磁盘、光盘、固态存储器(如闪存)等等。如图3所示,专用大容量存储设备是硬盘驱动324。各种设备也可包含与大容量存储器308之中以能从各种计算机可读介质上进行读写。大容量存储设备308包括可移除介质326和/或不可移除介质。

I/O设备310包括允许数据和/或其他信息从计算设备300输入或输出的各种设备。例如I/O设备310包括指针控制器、键盘、输入板、手机、监视器或其他显示设备、麦克风、打印机、网卡、调制解调器、摄像头、CCDs或者其他图像捕捉设备等。

显示设备330包括可以向计算设备300的一个或多个用户显示信息的各种设备。例如显示设备330包括显示器,显示终端,视频投影设备等。

图像处理单元(GPU)332可与处理器302相联接和/或与显示设备330相联接。GPU可操作地向计算机提供图像并实现其他图像处理。GPU可包括通用处理器的部分或全部功能,比如处理器302。GPU也包括其他专门用作图像处理的功能。GPU包括与坐标转换、着色、绒面、光栅化、和其他可向计算机成像提供帮助的功能相关的硬编码和/或硬件连接的图像功能。

接口306包括允许计算设备300与其他系统、设备、或计算环境相交互的各种接口。范例中的接口306包括任何数量的不同网络接口320,比如局域网(LANs)接口,广域网(WANs)接口,无限网络接口和英特网接口。其他接口包括用户接口318和外围设备接口322。接口306还包括一个或多个用户接口元素318。接口306还包括一个或多个外围接口比如打印机、指示设备(鼠标、触控板等)、键盘等接口。

总线312允许处理器302、存储设备304、接口306、大容量存储设备308、和I/O设备310彼此通信,且其他设备或元件与总线312相联接。总线312表示一个或多个若干类型的总线结构,比如系统总线、PCI总线、IEEE1394总线、USB总线等等。

为了便于说明,程序和其他可执行程序的元件在本文示为独立的方框,但是应理解这些程序和元件可位于计算设备300的不同存储元素的各种时间,并且通过处理器302来执行。可替换地,本文所述的系统和程序可在硬件中实现,或者在硬件、软件和/或固件的组合中实现。例如,可编程一个或多个专用集成电路(ASIC)以实现本文所述的一个或多个系统及程序。

本发明可以不背离其构思或必要特征的其他特定形式来实现。本申请所描述的实施例应该从各个方面仅仅考虑为说明性的而非限制性的。因此,本发明的范围由所附权利要求书指出,而不是由前面的描述来指出。在等同于本权利要求书的意图和范围中的所有变化均应落入权利要求的范围之内。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1