您的位置 首页 java

Java并发编程(十八)指令乱序机制及预测执行

上一篇:

发展演变

386时代:指令是顺序执行的(假设一指令占一个时钟周期)

486时代:引入流水线(pipeline)技术

存在问题:流水线空转、分支问题

很多执行组件处于堵塞(Stall)状态,严重拉低了流水线的吞吐量:

乱序执行: 整体执行方式从程序流驱动变成了 数据流驱动

分支问题,引入分支预测技术:预测执行(Speculative Execution)

判断哪条分支最可能被执行,预测执行会执行Fetch那里的执行,并立即执行。

如:if判断中有一段逻辑代码,很可能先去执行 if 里的代码算出来结果,然后最后再来判断if是否成立

 int i = 0,j = 10;
if(i<j){
    System.out.println("i=" + i);
}else {
    System.out.println("j=" + j);
}  

那么问题来了:

预测执行时,预测错误了怎么办?

答:错了就错了,重新Fetch执行。

(有个数据是:现在 CPU 的分支预测引擎十分的精准高效,预测成功率高于95%。)

预测执行

预测执行(Speculative Execution)技术,它和multiple branch prediction(多分支预测)、 data flow analysis(数据流分析)三项技术,一起构成了 out-of- order execution (乱序执行,OOOE) 的技术基石。它是现代高性能计算的基础技术之一,广泛被应用在高端ARM CPU(包括各种定制 ARM 芯片: 高通 、Apple、etc), IBM的 Power 系列CPU, SPARC 和X86 CPU中。

  • 计算机的一条指令的执行,简单来说分为4步,即:

1) Fetch:指令取出

2) Decode :指令解码

3) Execute:指令执行

4) Write:结果写回

指令乱序机制

指令不一定是拿到了一个指令立马可以执行的, 如果从内存读取数据的加载指令、除法运算指令等延迟(等待结果的时间)较长的指令后面紧跟着使用该指令结果的指令,就会陷入长时间的等待。尽管这种情况无可奈何,但有时,下一条指令并不依赖于前面那条延迟较长的指令,只要有了操作数就能执行。

此时 为了提升效率 可以打乱机器指令的顺序,就算指令位于后边,只要可以执行,就先执行,这就是乱序执行(Out-of-Order)。

把编译好的指令一条一条读取到处理器里,但是哪个指令先就绪可以执行,就先执行,不是按照代码顺序来的。每个指令的结果放到一个重排序处理器中,重排序处理器把各个指令的结果按照代码顺序应用到主内存或者写缓冲器里;

参考:

文章来源:智云一二三科技

文章标题:Java并发编程(十八)指令乱序机制及预测执行

文章地址:https://www.zhihuclub.com/187537.shtml

关于作者: 智云科技

热门文章

网站地图