http://bbs.csdn.net/topics/220076172
乱序执行对程序员透明
乱序执行是现代cpu使用的一种技术,用以提高cpu的利用率。
一个不恰当的比方:
要做一个项目,有几个架构师,几个程序员,几个市场人员等等,大家分工不同项目来的时候,如果一个一个步骤走下去,先市场,架构,在到程序员,比较慢,于是,有个天才的领导,随意的把项目的各个步骤先分发给每个人。
架构师先根据已知的一些信息进行架构设计,程序员开始部分编码市场人员跟进客户,执行了一段时间后,领导把大家的工作成果汇总,结果发现,很巧合的,虽然大部分程序员设计的代码和大部分架构师设计的系统不稳和市场人员的调研结果也和设计大部分不吻合,但是总有一小部分是可以整合在一起的,这样就小小的节省了一点时间介个就叫做乱序执行
乱序执行是有条件的,不是真乱:
1: int x=0,z;
2: x=1;
3: y=2;
4: if(x>0) z=10/x;
5: y=y+x+z;
上面的代码,在顺序cpu上,绝对可以保证第2句在第3句前完成。
但是在乱序CPU上,不可能有人知道第2句和第3句究竟谁先完成。因为你把第2、3句反过来写程序的执行结果也不会有丝毫改变。你能做的事CPU也能做。
可以保证的是:第5句一定是最后才执行,因为他所需的变量值必须等前面3句执行完才可以确定。
有一点可能性的是:
在顺序cpu上第一句(x=0)会被执行。而在乱序CPU上,第一句可能不会被执行,因为x的连续两次赋值之间,它的值没有被别人取用,所以第一次赋值的操作可以抛弃,从而减少了一次无用的运算。
在调试模式下,程序是没有优化过的,不会启动编译器的指令重排优化,也不会启动CPU的指令乱序执行。指令乱序执行和编译器的重排优化对调试是没有影响的。乱序执行对于执行结果是不会有影响的。只有在指令之间没有相互依赖的情况下才会使用乱序执行。
其实乱序执行一直都有,流水线就是这个原理。这次这个“乱序引擎”给我的感觉就是把流水线加得更深了,CPU有更多硬件资源可以用,更多的没有相关性的指令可以被同时执行。这些对高级程序员来说都是透明的,指令执行顺序是由编译器确定的,CPU是在保证指令执行结果正确的情况下,同时执行多条指令。所以程序员完全没必要担心。
但汇编级编程还是可以人工干预指令执行顺序以获得更快的执行速度