浮点指令的优化

原创 2003年09月09日 09:10:00

现在的编译器都能够针对浮点指令做优化,但是,我还是想你推荐VC,我认为,VC的优化更好,它能够更好地利用Pentium系列处理器的流水线。 <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

·  优化概略

·   尽量理解你的编译器处理浮点指令的原理,要知道,你不可能把一个程序完全用浮点指令来写,更多的代码还是基于高级语言的。

·   找出程序的关键所在,例如循环等代码,这些是真正影响效率的地方。

·   分离相关代码。

·   注意解决对内存带宽的需求。

·   检查是否有较长延迟的指令频繁使用,尽量减少。

·   如果不必要,尽量使用较低的精度。在很多指令操作中,使用较低的精度会获得较高的速度。这样也可以节省内存。

·   让你的结果在精度允许的范围内波动,超过精度范围的运算将会带来极大的开销。

·   善用fxch指令,以优化流水线。

·   在必要的时候展开循环,并且重新安排指令的顺序。

·   改变数据访问的模式,尽量使将要访问的数据位于缓存中。

·  提高并行度
Pentium II和Pentium III都只有一个被流水线化的浮点单元,合理的计算流程可以提高并行度。这样,你必须知道哪些指令是被流水线化的,一些常用指令的延迟是多少!请看下面的语句:

        A = B + C + D;

        E = F + G + H;

使用浮点指令可以实现的最简单的算法是:

        fld B

        fadd C

        fadd D

        fstp A

        fld F

        fadd G

        fadd H

        fstp E

在上面的算法中几乎每一条指令都依赖于前一指令的计算结果,这将使流水线时断时续。再来看看下面的算法:

        fld B

        fadd C

        fld F

        fadd G

        fxch st(1)

        fadd D

        fld F

        faddp st(1), st

        fstp A

        fstp E

上面的代码使用了fxch指令,这是在浮点优化中很重要的一条指令。fadd的延迟是三个时钟周期,上面的指令序列几乎避开了每一个延迟。

·  fxch指令
在Pentium II和Pentium III处理器上,fxch指令的执行没有附加的时钟周期的消耗。你可以用它来访问堆栈深处的元素,这使浮点堆栈的使用更加灵活。

·  循环展开
把循环展开有以下好处:

·   减少了跳转的频率,这样,跳转的代价就不那么明显了。

·   可以统一编码,充分利用空闲的寄存器,提高运算速度。

·   更好地安排指令,减少其相关性,有更大的空间去优化流水线的设计,更容易安排指令,使之适应解码和预取的要求。

循环展开并不是仅仅减少了几个指令,要是想获得高性能,你有必要重新设计算法,尽可能去利用更多的资源。

·  浮点指令的延迟
很多浮点指令都有不止一个时钟周期的延迟,但是,由于Pentium II和 Pentium III有乱序执行的能力,这些延迟并不一定会很明显。但是,如果一条指令具有很长的延迟,我们就要重点考虑了。下面就来具体讨论一些指令的延迟,及其解决的方法。

·   浮点存储的延迟
一条浮点指令的存储操作必须付出一个额外的时钟周期去等待它的操作数。在fld之后,fst必须等待一个时钟周期;象fmul,fadd这样的指令,通常是有三个时钟周期的延迟,而它们后面的fst操作必须等待一个附加的时钟周期,也就是说它将忍受四个时钟周期的延迟。请看下面的例子:

·                      ; Store is dependent on the previous load.

·                      fld meml  ; 1 fld takes 1 clock

·                                ; 2 fst waits, schedule something here

·                      fst mem2  ; 3,4 fst takes 2 clocks

·                      fadd meml ; 1 add takes 3 clocks

·                                ; 2 add, schedule something here

·                                ; 3 add, schedule something here

·                                ; 4 fst waits, schedule something here

·                      fst mem2  ; 5,2 fst takes 2 clocks

·                     

 

·                      ; Store is not dependent on the previous load:

·                      fld meml  ; 1

·                      fld mem2  ; 2

·                      fxch st(l); 2

·                      fst mem3  ; 3 stores values loaded from meml

·                                ; A register may be used immediately after it has

·                                ; been loaded (with FLD):

·                      fld mem1  ; l

·                      fadd mem2 ; 2,3,4

 

·   计算的延迟
一些常用的指令,如fadd, fsub, fmul等,都有三个时钟周期的延迟,如果你想使用它的计算结果,就至少要在它后面插入两条指令。
对于一些具有较长时钟周期延迟的指令如fdiv, fsqrt等指令,就要考虑在它们后面插入整数指令。而且也应当考虑尽量减少这类指令的使用,似乎在任何处理器中,浮点除法都是极其耗费时间的,AMD甚至要使用迭代的方法来计算除法和平方根。 

·   整数及浮点乘法
整数的乘法操作如:mul, imul,它们都是在浮点单元中执行的,所以,它们不能和浮点指令并行计算。
尽管浮点乘法的吞吐量为一个时钟周期,但是,fmul每两个时钟周期才能执行一次,如果你将两个fmul写在一起,你将免费获得一个时钟周期的延迟。注意,如果写成fmul/fxch/fmul的形式,效果也是一样的。

·   浮点单元的整数运算
尽量避免一些带有整数参数的浮点指令如:fiadd, fisub。应该把它们分解成两步来进行:一条fild加上一条相应的浮点指令。fiadd等指令将霸占流水线四个时钟周期,而替换以后却只需占用两个时钟周期。

MIPS处理器下浮点指令的处理方法

这几天编译qt,运行起来非常慢,组长让我试一下软浮点的编译器,说处理器不支持浮点,用软浮点编译器编译下会运行快一点,对于软浮点不是很明白,就网上搜集了一下,总结一下:    在嵌入式领域,为了节...
  • skyflying2012
  • skyflying2012
  • 2012年12月14日 17:10
  • 2622

汇编语言学习笔记(十二)-浮点指令

浮点数如何存储浮点寄存器浮点数指令浮点计算例子浮点高级运算CMOV移动指令 浮点数如何存储 浮点数的运算完全不同于整数,从寄存器到指令,都有一套独特的处理流程,浮点单元也称作x87 FPU...
  • u010229420
  • u010229420
  • 2017年02月07日 14:23
  • 3565

代码优化-之-优化浮点数取整

                           代码优化-之-优化浮点数取整                        HouSisong@GMail.com  2007.05.19tag:...
  • housisong
  • housisong
  • 2007年05月19日 09:55
  • 11728

x86 浮点运算

初学MASM,写了个程序,涉及到浮点运算,郁闷了两天那个纠结啊,直到今天才搞懂!!!貌似网上的资料少了点,虽然找到了,可没太多说明(可能我汇编底子烂的可以吧)先看看一个简单的代码片段        f...
  • Just_Fancy
  • Just_Fancy
  • 2011年01月02日 17:12
  • 1204

Floating Point Optimization(ARM 浮点优化方案)

Floating Point Optimization 目录  [隐藏]  1 Introduction2 Compiler Support3 VFP-L...
  • peng654321
  • peng654321
  • 2015年09月22日 18:15
  • 960

C++ 中的浮点代码优化

原 作 者:MS原 出 处:enet发 布 者:loose_went发布类型:转载C++ 优化编译器不仅能够将源代码转换为机器码,而且能够对机器指令进行适当的排列以便改善性 能和/或减小大小。遗憾的是...
  • Nhsoft
  • Nhsoft
  • 2004年11月22日 21:24
  • 3292

浮点指令

传说中有那么一些指令叫浮点操作指令。今天在看linux源码时,偶然发现一条陌生的指令,原来传说就在眼前了。INIT/FNINIT--Initialize Floating-Point UnitDes...
  • alunlee
  • alunlee
  • 2010年03月27日 09:57
  • 332

浮点运算的优化

转自:http://blog.csdn.net/mathe/article/details/1415321 比如对于代码int x,y;...y=(x+1)+(2*x-2);那么我们很清楚,编译器可...
  • CYP_2015
  • CYP_2015
  • 2017年05月05日 13:55
  • 321

《ARM 指令集》IEEE浮点指令

ARM 可以与最多 16 个协处理器相接口(interface)。ARM3 和以后的处理器在 ARM 内有虚拟的协处理器来处理内部控制功能。而可获得的第一个协处理器是浮点处理器。这个芯片处理 IEEE...
  • chuanzhilong
  • chuanzhilong
  • 2016年10月23日 21:17
  • 544

汇编,浮点运算符,fldpi,fmul等指令说明。

协处理器指令系统   协处理器共有68条不同的指令,汇编程序在遇到协处理器指令助记符时,都会将其转换成机器语言的ESC指令,ESC指令代表了协处理器的操作码。 协处理器指令在执行过程...
  • jinangl
  • jinangl
  • 2014年04月03日 14:05
  • 1387
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:浮点指令的优化
举报原因:
原因补充:

(最多只允许输入30个字)