论文部分内容阅读
很多的学术研究和工程应用都会涉及到数据的处理,而且范围也很宽泛,处理的数据既可以很小也可以非常庞大。这些应用一般常用定点数和算术运算来描述。但在很多情况下,这种方法描述的范围对所需的应用领域并不适用,从而导致了数据的频繁溢出(上溢和下溢)。所以,浮点数表示法的使用很好地解决了这个问题。浮点数能够在不影响操作数运算的情况下对真实数进行动态范围的扩展。在大多数的数字系统中,浮点数也是构成实数运算的主要模式。目前,浮点数已被广泛应用在如物理学、航空航天系统、核仿真、图像和数字信号处理、自动控制系统、最优控制、金融等系统中。浮点数被编码的位数数量有限;它是仅代表有限子集的实数无限集。浮点数的编码格式包含两部分,有效数字部分(也称作尾数)M和指数部分(也称作首数)E。浮点数F可以用(M,E)表示:F=M·βE。这种表示法的精度取决于有效数字的位数。浮点数总的数字位数由有效数和指数决定。因此,同一实数浮点表示的精度比定点表示的小。很多上一代的处理器都包含基本的用于处理整数运算算术逻辑单元(ALU)的CPU芯片和优化的浮点协处理器(称为FPU)的芯片。得益于近年来集成电路(IC)更高密度的提升,因此这已实现了这两个单元在单一芯片上的集成,但如何在芯片高速缓存存储器上来存储大量的数据和指令,仍有很大的挖掘空间。设计FPU是用来处理浮点数的所有运算的,它之所以被称为协处理器是因为集成电路中的中央处理器单元(CPU)有可被嵌入的扩展芯片或组件。在20世纪60年代到80年代,各种各样的浮点数据格式用在一些关键系统中。因此,电气和电子工程师协会(IEEE)为了使浮点数的格式有共同的标准,相继在1985年制定了IEEE754-1985标准,1987年制定了IEEE854-1987标准,2008年制定了IEEE754-2008标准。在过去几十年间,对提高计算性能、提高算法速度的改进正在不断地研究和发展中,很多著作和论文都提出了加快加法、减法、乘法、除法算术操作速度的创新观点。这些包括定点数和浮点数的算术运算的创新和改进,能够更快速地实现加/减法运算和乘/除法运算。此外,现场可编程逻辑门阵列(FPGA)越来越多地用于硬件加速的高性能浮点计算。由于FPGA上的浮点实现是一种特定的应用,一种在一台设备上运行的最佳算法可能不是另外一台设备上的最佳算法。因此这就需要投入大量的研究以改进在FPGA上实现的浮点运算,算法的改进包括速率和存储面积的改进。集成电路在高性能计算、通信和消费类电子产品中使用得越来越普遍。随后就出现了一个全新的设计理念,专用指令集处理器(ASIP),它取代了通用电路的使用。ASIP是一种可编程处理器,它是为某个特定的应用程序的某个系列而设计的,如微控制器、DSP、媒体处理器、IO处理器、网络处理器和特殊域处理器的可编程处理器。这些处理器比类似的在高效节能情况下能够运行更高的时钟频率,且比通用处理器更小、更简单。ASIPs不仅能够最大限度地提高目标系统的体系结构的灵活性、编程性和嵌入式软件的可能性,而且从性能、功耗、成本和灵活性方面等来讲,它也弥补了专用集成电路(ASIC)和通用可编程处理器之间的差距。 本文研究的重点是设计一种能加速浮点算术运算的高效算法。如上所述,浮点数是用来表示这些在信号处理中用到的数。本文目标是在运算电路能够正常工作的基础上,使其具有更高的性能。把当前涉及到的操作通过查找表(LUT)分解得到的微操作的方法来支持芯片层上进行的算术运算和提升运行速度。除了加快计算速度,本文在芯片上实现了所设计的算法,并使芯片存储的资源得到最优。本文的算法使用VHDL和Verilog语言来编写,并在Xilinx和Altera的FPGA上实现。通过实验获得频率、周期数以及程序在FPGA上运行后占用的slices和LUTs的数量。通过与现有的研究结果比较,试图找到最佳的设计/算法。 本文研究主要有三部分组成: 1.提出一种基于FPGA平台的全加器(FA)并有两种优化的结构:(1)缩短全加器/全减器(FA/S)关键路径以提高频率;(2)用较少的门定制一种新的FA/S电路。 本文的第一个工作是加/减法运算的研究。首先是提高加/减法操作在电路中的运算速度。1位全加器(FA)在含有如计数器,加法,减法,乘法和除法等运算的系统中应用广泛。所以FA的创新和加速意味着CPU、FPU和整个系统都要得到加速。正因为FA是CPU中的一个基本单元,要对它进行改进是非常困难的。然而,这并不能阻止研究者们试图对FA加速。一个标准的FA是由异或门、与门、或门组成的。一些研究人员认为可以用与非门、或非门、非门等来代替FA中异或门的使用,并且这也可以减少互补式金属氧化物半导体(CMOS)电路的数量。然而,这种方法占用的总逻辑门数还是相对较高。现在有种研究趋势就是对CMOS的寄存器传输级(RTL)级进行研究。现在的CMOS设备大都采用的是纳米工艺,减小CMOS晶体管的尺寸就可以增大集成电路的密度、提高集成电路的性能,但会导致大的动态消耗。为加速FA,一种方法是近似阀值计算,另一种就是量子计算。纵观近年来发表的文章,研究人员也尝试加速FA,但是其构思和实现都相当复杂,逻辑门的占有率仍然很高。 总的来说,现有的方法占用的逻辑门数依然较大。CPU中算法研究的发展代表着对FA的改进需要一个新的方向。电子和可编程器件的广泛应用使我们能够对其他研究人员的算法进行构建和测试。 目前FPGA以各种可行的方法灵活地应用在各个领域。同时,还有一些文献有关于复用器加速的研究,由此可见,改善FA并不过时。此外,关于改进FA在FPGA上实现的文章很少,因此提高FA在FPGA上的速度是很有必要的。而且,为了用传统方法创建1位FA,需使用两种门。这就使电路更为复杂,并且当存在n位的减法运算时,就需要一个n输入的异或门。FPGA器件的日益流行,以及多路复用器的推动和FPGA方面的改进,使得在FPGA中查找表(LUT)的配置可以作为存储器和逻辑功能工作。这就形成了一个大LUT里面包括许多小LUT这种特殊现象。本文主要是基于LUT和多路复用器来加速FA。以此为基点,为了使FA/S的制造更简单,本文扩展了研究范围来改善FA/S并减少元件数量。在改进加减法运算时我们提出了两个任务。在第一个任务中,LUT可用作存储器或逻辑功能,这有助于实现LUT作为存储器来加快FA的操作。在第二个任务中,本文提出了关于全加器和全减器(FA/ S)的新设计方法,并且已经在LUT上实现。该设计使用了支持自适应组合逻辑(ALM)的方法,其中每个ALM可以被配置为执行组合逻辑功能或逻辑算术运算。 从全加器和全减器真值表中可以对输出值得出这样的结论:和/差,进位标志。该结论源于当前的电子操作,提出可以通过接通/断开操作来获得预期的逻辑值:当 Carryin=0时, Sum/Sub=(x xory)(x=0→Sum/Sub=y;x=1→Sum/Sub=(y)),并且 Carryout=(x andy)(x=0→Carryout=0;x=1→Carryout=y)。当Carryin=1时, Sum/Sub=(x nxory)(x=0→Sum/Sub=(y);x=1→Sum/Sub=y),并且Carryout=(x ory)(x=0→Carryout=y;x=1→ Carryout=1)。另外,对于1比特而言,减法的输出与加法的输出是一样的。但是,还有进位标志需要计算,下面给出这个进位标志的计算公式:当Carryin=0时,y=1→Carryout=(x);x=0→Carryout=0。当Carryin=1时,y=1→Carryout=1;x=0→Carryout=(x)。基于二选一多路复用器为和/差和进位标志设计了两个硬件电路。使用多路复用器作为开关控制电路,允许预期值通过电路。FA和FA/S使用多个LUT实现。FA由两个LUT3-1组成,其中在slice中LUT3-1是一个基本LUT。因为上面提到的和/差值和进位标志在同一时间内生成,所以需要使用两个基本LUT3-1:一个用于和/差电路,一个用于进位电路。通过对加法和减法的两个真值表,以及加法和减法进位输出标志的两个电路进行观察,可以看出,电路有可能通过带有控制端口0(add)和1(减法)的FA/S来实现。另外,FA/S的最终实现电路需要使用一个LUT(6个输入端口,2个输出端口),它分成两个小的LUT,一个用来实现和/差,一个用来实现进位标志。当进位标志等于1,加法表示“溢出”和减法表示“借位”。那么,和/差电路和进位标志电路就可以同时执行。 现在Xilinx公司和Altera公司推出了新型LUT,这样设计者就可以使用Xilinx公司的LUT6-2或Altera公司的ALM来执行FA/S中的1位,而其余的输入可用于与其它功能互连。本文设计电路通过Xilinx ISE工具,在Xilinx公司的Spartan3E,、VirtexⅣ and Virtex5上综合实现,仿真和测试结果。FA设计的三种实现方法(标准的FA实现,FPGA加法器单元实现和本文提出的FA实现)对FGPA资源占用情况包括slice的数量,slice触发器的数量,4输入LUT的数量,IO的数量,IOB的数量,逻辑电平和时序约束(ns)(逻辑(ns)和路径(ns))。通过实验数据对比发现,本文提出的FA在使用同等硬件约束条件的情况下速度比标准FA快20%到30%即便约束减半,本文提出的FA/S速度比标准的FA/S仍快28%到40%。 2.设计一种新的浮点数乘法器,这种乘法器把主乘法器划分成了几个子乘法器,并且这几个子乘法器之间可以协同运算,这样就加快了浮点数乘法器的运算速度。这些子乘法器可以同时处理单精度和双精度的数据。此外,本文还在这些乘法器中使用了流水线技术,这样就可以让四个乘法器同时进行运算。 本文设计了一个可以协同计算的乘法器,这种四倍精度的乘法器架构支持并行的双精度的浮点数乘法运算,并且在这种乘法器中使用了子乘法器,这些子乘法器可以通过流水线的方式进行协同运算。此外,本文还提出了一个双精度浮点矩阵乘法的加速器的架构,这种设计的目的是最大程度地减少资源的利用率以及最大限度地提高时钟频率,在这个设计中使用了多核的设备加速FPU的运算。本文同样也研究了传统的乘法器的加速方法,一般通过减少部分乘积的数量和复杂性来减少部分乘积的计算时间。 本文提出了一种新的可以加速浮点数乘法运算的乘法器。本文对原来的乘法器做出了一些改进,减少了累加的次数以及浮点数乘法器的寄存器长度,累加次数的减少就可以把乘法器划分成更小的子乘法器,而这些子乘法器之间可以进行协同运算。现在的计算机拥有更多的资源,使用FPGA编程可以使这些子乘法器同时处理多个乘法运算。本文使用寄存器存储了临时变量,这些寄存器保存了乘数和被乘数,乘数和被乘数的长度都为n位,而传统的乘法器中寄存器是2n位,这就减少了寄存器的长度。因为减少了加法的次数,所以也就减少了计算的时间。因此,这种方法和原来的方法最大的区别是需要一个2n位的寄存器存储n位的乘数和被乘数相乘的结果。该算法另一个创新点是在子乘法器中使用了减法,而且最终的结果可以通过减法、加法以及求余来获得。在求余完成之后,会获得一个最终的结果,这个结果越接近正确的结果越好。 为了减少累加的次数以及部分积的长度,可以建立以下等式:X×Y=X×(Y1-Y2),在这个式子中X代表乘数,Y代表被乘数,Y1、Y2代表浮点数,有效数的长度减少到n/2位,通过Y1=(Upper(My).2Ey+1.2-n/2+1.2Ey)以及Y2=(1.2-n/2+1.2Ey-Low(My).2Ey-n/2)可以得到计算结果。乘法等式现在可以表示成:X×Y=(X×Y1-X×Y2),其中有效数为Y1,Y2的长度只有n/2位,X仍然为n位,X×Y1和X× Y2的长度为(n+n/2)位。因此,在实现子乘法器的协同计算的时候,迭代的步骤减少为n/2次,累加的寄存器减少为3n/2位,而不是原来的2n位。以下是X×Y1和X×Y2乘法器的一些细节,这些细节表明一个主乘法器可以被划分为两个子乘法器:X.Y1=Upper(X).Y1+Low(X).Y1=∑n/2 i=0 Upper(X).Y1i.ri+∑n/2 i=0 Low(X).Y1i.ri-n/2,X.Y2=Upper(X).Y2+Low(X).Y2=∑n/2 i=0 Upper(X).Y2i.ri+∑n/2 i=0Low(X).Y2i.ri-n/2. 以下是四个子乘法器: U=∑n/2i=0 Upper(X).Y1i.ri,M1=∑n/2i=0 Low(X).Y1i.ri-n/2, M2=∑n/2i=0Upper(X).Y2i.ri和L=∑n/2i=0 Low(X).Y2i.ri-n/2。这四个子乘法器只需要n/2次累乘,特别是在有效数的长度只有n位的时候。通过输入值的说明就可以知道这些变量之间的关系。该算法可以处理双精度格式(64位)的乘数和被乘数,其中浮点数的标志位占一位,有效位占52位,指数位占11位。这个结构的设计为了对FPGA芯片进行操作,这将导致可以有4个乘法器协助X,Y1和Y2之间的乘法运算。 此外,在设计乘法电路的过程中,本文发现在系统中的步骤都是顺序执行的,而不是迭代执行。根据这个特点可以在这个乘法器中使用流水线技术。本文设计了一个4层的流水线,当一个时钟脉冲信号被检测到,四层的流水线就将同时执行,每层的结果存储在寄存器中,当下一个始终脉冲信号产生的时候,每层的输出可以作为下层的输入。因此,最终的结果可以在发出4个脉冲信号之后获得。这种设计允许一个乘法器可以同时执行多个乘法运算。本文还提出了另外一种乘法器,这种乘法器可以处理双精度格式的数据,该设计实现了数据通路的复用,使得乘法器有能力同时处理单精度和双精度的数据。所有的这些乘法器(包括传统的乘法器和新提出的乘法器)都放在3个FPGA平台上实现,包括Spartan3EXC3S500E5FG320、 Virtex55VLX330TFF1738-2以及 Virtex7 XC7V1500T-2FLG1761-2,这里面的测试值包括查找表的数目、最小周期(ns)、最大周期(ns)、频率(MHz)、IOBs的数目和总时间(ns)。通过对实验的结果进行分析发现,使用VHDL语言实现的方法比在Spartan3E XC3S500E-5FG320上实现的乘法器要快25%到40%,比在Virtex55VLX330-TFF1738-上实现的乘法器要快36%到47%。全新结构的乘法器在Virtex7 XC7V1500T-2FLG1761下用VHDL语言实现比传统的乘法器要快27%到42%。这种新的结构比其他使用位移和累加方法的结构要快30%到50%。双精度的乘法器在FPGA Xilinx平台上实现,实验的结果表明该设计的乘法器有一定的加速。本文提出的乘法器比传统乘法器要快26%到47%。本文还实现了双精度格式的乘法器。实验的结果表明该乘法器在处理单精度数据的时候比处理双精度数据要节省25%的能量。在Virtex7,Virtex5和Spartan3E平台上乘法器分别加速8.3%,14.1%,14.2%。这个乘法器同样可以处理不同类型的输入数据,今后的工作中本文会把乘法器扩展到可以处理其他数据格式。此外,本文提出的流水线结构可以用4级流水线实现,代替以前研究中的多于4级流水线的实现。 3.提出一种新的除法算法,其中商数通过可预测函数来得到。可预测函数可以用被除数和除数的数位来预测快速得到商。最终商是通过累计所有的预测商数来计算。因此,减少迭代次数可以减少计算时间,除法运算速度也得到显著提高。 在加减乘除四项基本运算中,浮点除法的操作最为复杂。在这一除法中,两个操作数的尾数或有效数被分开,同时它们的指数被去掉。最终的商值通过一个标准的浮点除法得到。然而,在某些情况下,根据应用程序的要求,或用户可能想监控计算结果,这样就必须需要知道余数。现有操作中产生余数由软件来执行。“DIV”和“MOD”命令用来执行的除法和生成商和余数。位-循环除法算法是一个简单的方法,它使用迭代结构来计算商,产生每轮每个商的值。每一步运用商-位选择功能以确定商数(n位)。在该算法中,商是n位,总的迭代次数是n。提高除法运算速度的另一个方法是高位-基数斯威尼,罗伯逊和托赫尔(SRT)算法。在SRT算法中,每个商都有一个符号位,{α,—α-1,…,(1),0,1,…,α},其中「1/2(β-1)(」)≤α≤(β-1)β为基值(β=2m)。总的迭代次数是n/m。SRT算法的缺点是,除法运算前除数必须归一化(MSB等于1),并且最终商带有符号位(SD)。由于SD每一位都需要一个正或负的符号,从而导致需要更多的位输来表示SD。另外还必须增加一个功能把SD转换为二进制数。 由于以上这些原因,在浮点除法运算方面已经进行了大量的研究,SRT除法在低除法器延迟方面得到了很好的研究。然而,这种实现方式延迟很大,因为每个周期最多只能运算10位。另一个研究重点是浮点乘法器,浮点乘法器为除法提供了一个专用的乘法器。但是,缺点是没有余数,并且在取整过程中有一定的难度。相比于浮点乘法,浮点除法方面的研究很少。然而,越来越多的嵌入式应用需要使用浮点除法。但把除法和系统融合在一起时,又会降低系统性能。为了解决这种问题,程序员必须重写代码,接受因溢出或不稳定而造成的较差数值表示。LUT和泰勒级数近似方案提出通过使用近似商方法来减少迭代的次数。但是,这个方法应用到软件平台时安装过程很复杂。本文提出了利用可变延迟分割器来产生基于不同指数的商比特数。因此,成本、性能和精度之间的权衡得到平衡。 在另一方面,提出了一种基于泰勒级数展开算法的混合浮点乘法/除法/平方方案。但是,该方案的速度无法满足移动应用的要求。得到商的第一步是检索尾数和指数,但计算时间相当长。为了减少计算时间,提出了位-循环算法(例如SRT),高位-基数算法。这些方法的缺点是需要大量迭代运算。一些研究的目的是通过使用并行选择函数来获取每轮迭代的商来得到最终。缺点是,在下一个迭代之前余数必须规范化(最高有效位为1),并需要附加计算决定商的位数。泰勒多项式逼近和牛顿迭代方法使用LUT得到计算结果。因此,大面积LUT的大小是必需的。以上这些方法都使用固定数量的迭代,固定数量是基于有效长度。与此同时,其他方法不需要这个数量,但是需要最优函数来获得所需的结果。提出的算法增加了成最终商的生成速度。它还允许用户跟踪直到获得其余部分可能的最小值。也就是说余数可以由用户设置阈值,这样可能会生成最终的优化值系数。 在CORDIC方法中,系统中只有改变、添加,LUT模块用于变换预期的双曲函数和三角函数系统中对应的二进制数。牛顿迭代技术使用迭代获得函数的根,使用迭代变换根源。提高了基于GA的CRO。GA和CRO方法只工作在随机选择数上,必须计算工作直到获得一个最优的结果。这两种方法都基于一个数据集,然后使用迭代达到所需最佳函数的最佳值,所以他们需要的系统包括很大的内存和高速度。在这种算法中,本文结合基于CORDIC传递方法来检索相结合最终结果,基于GA和CRO方法的牛顿迭代方法获得最优结果。如果获得所需的函数迭代将停止。最终商通过累加所有迭代预测值得到。在每个迭代步骤中计算商和余数,如果这余数等于固定余数时计算结束。提出的商的计算使用LUT比现有的计算速度更快。LUT(256到4096个元素)和指数调整值(与非门)上该算法提高了预测值的扩张范围,在每轮迭代中能够获得相对准确的预测系数,本文提出了一种新的公式快速检索最终商。鉴于被除数F1和除数F2,系数n是为了建立F1,F2和符合下列要求的F1的新值之间的关系:F1=n.F2+F1这个方程式除以F2的左部分和右部分。本文知道:F1/F2=n.F2+F1/F2=n+F1/F2.F1/F2的商是n,F1是余数。因此扩展F1/F2:F1/F2=n1+F2+F1,1/F2=n1+F1,1/F2=n1+n2.F2+F1,2/F2=n1+n2+F1,2/F2=…=n1+n2+…+nm+F1,m/F2。最终结果由商F3和余数FR组成:F3=∑m i=1ni和FR=F1,m,m是迭代的总数。它并不局限于单精度,双精度或双扩展格式,但这取决于预期用户设置的剩余部分,当观察触发的余数时可以改变。 操作时间依据不同系数n进行划分,程序员已经建立了查找表和上面提到要求的余数。表中数据是由被除数F1和除数F2的样本组成。事实上,n的选择是一种预测行为。LUT(预测ni)是该算法的重要组成部分。可以在每一个步骤中预测ni的系数。LUT被用于预测值(i是第i次迭代)。该LUT是由尾数F1,i(目前的被除数)高字节的某些位和尾数F2(除数)高字节某些位形成,作数据库内存存储功能。LUT按照非正常的IEEE浮点数格式建立F1,i和F2的前几位。根据这种格式,F1和F2的第一位尾数总是等于1。因此,这种新算法不考虑的第一个F1和F2的第一位,只考虑其余部分。本文首先结合F1和F2的m位。当m等于4时,F1与4F1位和4F2位结合形成同256个状态1个字节,所以LUT有256个元素。当m等于6时,结合F1和F2的前6位形成包含4096个状态的12位,因此LUT有4096个元素。每个元素的地址由这些新字节组成。在LUT中每个元素有8位长度,被定义为ni,7,ni,6,ni,5,ni,4,ni,3,ni,2,ni,1和ni,0。他们之间的互补性很强。其中,ni,0被称为扩展指数,其他7位被称为商的尾数。除法运作时,它会自动获得F1和F2的前7位,生成存储在LUT的元素地址。除法运算获得预测系数元素的值。商已经存储在LUT中,这样可以减少必需的内部分歧和删除工作。LUT中的值包括ni系数,这个系数是指数预测步骤尾数ni。ni来源于两个指数之间的系数和偏置的被除数与除数。 在算法的实现上,设计合成算法需要的软件包括Xilinx公司的ISE14.1,Altera公司的Quartus9.0和ModelSim6.5a,使用Verilog硬件来描述语言。当LUT从256个元素扩大到4096个元素时有两个实现方法,预测4位和6位比较成本。本人认识到,当尾数的长度,指数和LUT尺寸增加时,该面积会变得更大、频率下降。然而,增加面积是没有必要的,只需要139到591片,1073到7687年LUTs来存储。也就是说,他们只占用Virtex-5 XC5VLX330上1%到4%的资源。为了获得频率,一个迭代内所需时钟周期的数量以及占用的片和LUTs的算法,一个迭代内每个周期的时钟脉冲数是时钟周期的数量。本文在Virtex-5XC5VLX330 FPGA上模拟对被除数和除数。在不同的要求下观察这些测试值。例如,尾数为1,指数为5,-10,-15和-20,需要十进制时间长分别为0.003125,0.00097656,0.000030518,和0.0000009536。生成的商和余数的值来测试该算法的可靠性。 因此,结果证明可以用更少的步骤得到商。结果显示,大约需要3到5轮迭代平均获得的商的余数满足用户设定的剩余部分。此外,第一个结论是,前两个步骤的操作收敛速度有显著增加,然后从步骤3或4,速度减慢或保持稳定。第二个结论,如果被除数比除数大,可以更快速、更准确地找到最终商。然而在某些情况下,当固定余数很小时,需要大量的重复操作得到稳定状态的最终结果,所以需要一个方法来结束操作。通常情况下,本文的算法需要重复3-5次改变商的不变值。但是,重复3-5次平均运算,迭代数量可以增加或减少,这取决于预测是否正确。此外,本文在Virtex-5 XC5VLX330和Stratix-Ⅲ EP3SE50F484C2芯片上执行。这些操作的主要目的是检查频率和面积。表中的结果还表明,分别在Virtex-5和Stratix-Ⅲ芯片上程序只需要1%到4%(1732 LUTs到1732 LUTs),5%到10%(1916(ALUT)到2010(ALUT))。 事实上,通过增加LUT值,包括元素的数量和长度,本文可以用更少的周期来迅速地找到商。因此,在每个迭代中ni可以更详细地预测到,最后商收敛速度更快,积累较低时数量增加。根据设计实现和实验结果表明,在每个迭代中预测函数可以很好地得到一个正确的预测系数。这有助于使用用户指定的剩余部分可以更快速地得到最终商。也降低了获得商所需的迭代次数。一般来说,浮点除法计算需要3-5轮迭代才可以达到最终商。更具体地说,该算法独立于不同格式的浮点数。该算法在FPGA上实现。此外,FMA函数已经集成在一些嵌入式设备中,本文利用FPGA实现的算法可以直接使用FMA迭代查找余数,避免了“标准化”的步骤。