什么是Speculative Execution?为什么要有它?

什么是Speculative Execution?为什么要有它?

预测执行(Speculative Execution)技术,它和multiple branch prediction(多分支预测)、 data flow analysis(数据流分析)三项技术,一起构成了out-of-order execution (乱序执行)的技术基石。它是现代高性能计算的基础技术之一,广泛被应用在高端ARM CPU(包括各种定制ARM芯片:高通、Apple、etc), IBM的Power 系列CPU,SPARC和X86 CPU中。Intel早在奔腾II就开始引入了它,它最近的曝光度很高,对它的功能却语焉不详。我们今天就从技术的角度来了解一下它的前世今生。

顺序执行与乱序执行

在正式开始之前,为了方便描述,我们这里引入一个简化版的计算机微架构模型:

计算机的一条指令的执行,简单来说是沿着粉红色箭头来运作。简单来说分为4步,即

  • Fetch:指令取出。
  • Decode:指令解码。
  • Execute:指令执行。
  • Write:结果写回。

在386时代,指令是顺序执行的。为了简化起见,我们假设每个步骤在一个时钟周期内可以完成。在那时,指令执行是这样的:

指令1(Instr1)执行完毕后,指令2(Instr2)才能执行,以此类推。我们可以看出在9个时钟周期内,指令执行了2条多一点。

在486后,引入了Pipeline(流水线)技术,将一条指令执行的四个步骤分别解放出来,就像流水线上的工人从1个全能高手变成了四个普通工人,每个普通工人只会干自己的事情,它弄完后就会将结果传递给下一个。这样指令执行就变成了:

理想最优情况

我们直观的可以看出来:一条指令还是需要4个时钟周期,但在9个时钟周期内完成了整个6条指令,吞吐量提高了将近3倍!这就是流水线的魅力所在,专人干专事,效率成倍增加,无怪乎福特发明的流水线迅速风靡世界。富士康的工人天天干一件事,会有苦闷和烦恼,但晶体管不会抱怨,把流水线引入CPU微架构真是个绝妙的主意!

这时的指令流水还是顺序执行(in-order execution),大家规规矩矩排队在流水线上运行,井然有序。但这种理想情况在现实世界里面却有诸多挑战:流水线空转问题和分支问题。

简化过程中每一步都只要一个时钟周期,这在实际情况中是很难满足的,很多指令执行周期不一,有些需要很多周期,而在此时,整个流水线其他的人都被堵塞了(in Stall):

可以看到9个时钟周期内只完整的执行了4条指令,很多执行元件都是处在stall的状态,严重拉低了流水线的吞吐量。

我们都知道,程序是有分支的,下一条指令去哪里执行在上一条指令还没有结束之前有时候是不知道的。我们将指令1(instr1)想象成if-then-else的指令(当然它不是一条指令能够涵盖,为了简化描述权作此安排),在它的Excute引擎执行完毕前,下一步去哪里Fetch code都无从判断,流水线被彻底被堵塞了。

流水线的这些问题部分可以通过加深流水的方式规避,但仍然问题多多,远远达不到理想最优情况。那怎么解决呢?

奔腾II后,Intel在CPU中引入了乱序执行(out-of-order execution,OOOE)。整体执行方式从程序流驱动变成了数据流驱动:只要部件的输入条件满足,就可以开始执行:

调整后的执行结果我们可以看出,因为指令3并不需要前面的指令2的输入,它在指令2之前就得到了执行,而指令2因为依赖于指令1的输出作为输入,反倒落后于指令3,这就是所谓的乱序。从整个流水线吞吐量来看,吞吐量恢复到了理想最优情况。

而在另一方面:分支问题。分支预测技术加上我们今天的主角:预测执行(Speculative Execution)技术,在这里大放光彩。分支预测会判断哪条分支最可能被执行,预测执行会直接Fetch那里的指令,并立即执行。这样等分支结果出来后,实际上那里的早就开始执行了,流水线上总是满负荷运转的,一个晶体管都不能偷懒!

有同学要问了,分支预测错误了怎么办呢?是啊,U非圣贤,岂能无措,错了就改嘛。前面执行的都白瞎了,重新Fetch来执行,反正晶体管又不会抱怨你浪费它感情。值得欣慰的是,现代CPU的分支预测引擎十分的精准合高效,预测成功率高于95%!

结论

在前文:

老狼:为什么CPU的频率止步于4G?我们触到频率天花板了吗?zhuanlan.zhihu.com图标

我们说过,CPU的主频高并不能代表高性能,主频高但在那里空转也不能解决实际问题。流水线、预测执行等等技术,都是为了让CPU里面的所有器件忙碌起来。分支检测和执行技术也是CPU代季更新中极力改善的部分,我们会在后文中详细介绍分支检测,以及它为为什么能够达到令人惊讶的高于95%的预测准确率。如有可能还会介绍双发射和多发射技术:

其他CPU硬件文章:

老狼:CPU制造的那些事之一:i7和i5其实是孪生兄弟!?zhuanlan.zhihu.com图标老狼:CPU制造的那些事之二:Die的大小和良品率zhuanlan.zhihu.com图标老狼:为什么晶圆都是圆的不是方的?zhuanlan.zhihu.com图标老狼:为什么"电路"要铺满整个晶圆?zhuanlan.zhihu.com图标老狼:CPU能用多久?会不会因为老化而变慢?zhuanlan.zhihu.com图标老狼:为什么CPU越来越多地采用硅脂而不是焊锡散热?zhuanlan.zhihu.com图标老狼:为什么Intel CPU的Die越来越小了?zhuanlan.zhihu.com图标老狼:破茧化蝶,从Ring Bus到Mesh网络,CPU片内总线的进化之路zhuanlan.zhihu.com图标老狼:450mm的晶圆在哪里?zhuanlan.zhihu.com图标老狼:什么是TLB和PCID?为什么要有PCID?为什么Linux现在才开始使用它?zhuanlan.zhihu.com图标

更多CPU电源管理的文章:

老狼:CPU省电的秘密(一):EISTzhuanlan.zhihu.com图标老狼:CPU省电的秘密(二):CStateszhuanlan.zhihu.com图标老狼:睿频:榨干CPU所有的潜力(CPU电源管理系列番外篇)zhuanlan.zhihu.com图标

欢迎大家关注本专栏和用微信扫描下方二维码加入微信公众号"UEFIBlog",在那里有最新的文章。同时欢迎大家给本专栏和公众号投稿!

用微信扫描二维码加入UEFIBlog公众号

编辑于 2018-01-21

文章被以下专栏收录