关于分支预测

 

昨日与某老汉聊天, 给我分享了一些机器学习相关内容,受益匪浅。老汉问我有关分支预测的问题,我解释得天马星空,貌似老汉已被误导,故今日撰写此文以理清逻辑。实际上分支预测这个词在N年前(N<3)在读深入理解计算机系统时就大概看过那么一段,但其中的原理一直没有深究,直至昨日老汉发问。下面让我们来了解一下。

 

假设你是一个19世纪的铁路搬岔工,负责当地的一个铁路岔路口,当时没有电话,也没有其他的无线电通信方式。火车到来之前,你根本不知道它想要去的方向。火车到来时需要停下来,你要问一下驾驶员要去那一边,然后调整岔路口的开关。

 

火车非常的沉重,同时惯性也非常大,所以火车启动和减速时能量损耗会很大,对火车的整体速度也会有影响。

 

那么是否有更好的解决方案呢?当然你可以猜测火车的前进方向并预先调整开关。如果猜对了,火车直接开过去,不需要减速。如果你猜错了,火车一定会错方向,这时火车需要停下来,倒车,回到岔路口,然后驾驶员给你一顿臭骂让你调整开关,最后驾驶员重新发动火车。如果每一次都猜对了,列车永远不用停下来。如果经常猜错,列车将花费大量的时间停车倒车重新发动。

 

 

计算流水线

 

现代的处理器会将每条指令分为以下几个阶段:取指,译码,执行,访存,写回。这些阶段被设计成流水线以提高整体吞吐量,也就是同一时间可以处理多个指令的不同阶段,也就是说处理器的处理超前于当前执行的指令,处理器会预先读出指令(取指),并解码指令(译码),来确定具体执行什么操作(执行)。见下图。

关于分支预测

 

 

关于分支预测

 

如果指令只是简单的顺序结构,指令流水线化会就会工作得很好(铁路线上没有分支,火车可以全速前进)。现在让我们考虑一下处理器的分支语句处理。现在假设你就是一个处理器正在处理一个分支语句(if 等语句),在if的最后一个阶段完成之前(写回),你不知道分支的下一条指令是什么。你该怎么做?停止执行,等待直到判断出条件语句,然后再加载下一条指令,然后继续执行?如果这样做的话,处理分支语句时,前面几个阶段的处理器都需要停止,这至少要浪费几个指令周期。 

 

CPU有很长的流水线(取指,译码,执行,访存,写回),CPU在”启动时也需要加速,停止时也需要减速”。

 

那么更好的办法是什么呢?猜(投机执行)!猜对了指令继续执行,没有任何性能损失。如果猜错了,需要重新刷新流水线(倒车)。

 

那么怎么去猜呢?这就是现代处理器里面的逻辑了,处理器会根据程序的历史来猜。具体怎么猜可以看这里http://zh.wikipedia.org/wiki/%E5%88%86%E6%94%AF%E9%A0%90%E6%B8%AC%E5%99%A8

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(分支)