为了快,提前算。这叫预测执行,英文叫pculatv cutn。」
沈亢将信将疑,「好家夥,听起来好玄学啊,cpu还知道我下一步要干什麽?听着跟算命一样。」
他都想赞美愚者了。
萧伯年笑了笑:「你觉玄,是因为你只看到了游戏。但在计算机体系结构里,这是早就被验证过的事。cpu内部有个东西叫分支预测器,遇到判断、循环、跳转这些指令,它不会等条件算完再决定走哪条路,而是先猜一条执行。猜对了,省时间;猜错了,就把结果丢掉,回退重来。这就是预测执行。」
沈亢点头:「这个我懂,猜对了赢时间,猜错了白干。」
「对。猜,总比不猜好。就好像同声传译,做同传的人,听到前面几个字,就已经在脑子里预测後面的句子结构了,甚至嘴都开始动了。大多数时候,预测是对的,整场翻译能跟上节奏。偶尔预测错了,停下来纠正一下。但总比一句一句等原话讲完才翻译快多。」
萧伯年似乎谈兴起来了,说完这个例子,又说道:「但你知道吗,英特尔当年不是没想过另一条路。」
「什麽路?」
「放弃预测执行。」
萧伯年说:「英特尔和惠普一起搞过一个架构,叫安腾。当时他们的想法很激进:既然预测会猜错,猜错了还要付出代价,那不如乾脆不让硬体去猜。把指令调度、并行判断这些事,全部交给编译器。编译器提前把指令排好,cpu照着执行就行,不需要预测,也不需要复杂的乱序执行。」
沈亢听入神:「听上去很合理啊。」
萧伯年点头:「理论上很美好。但安腾最後失败了,而且败很惨。」
「为什麽?」
「因为编译器做不到那麽聪明。大部分程序运行时候的信息,编译器根本预测不到,比如用户输入什麽、网络返回什麽、内存里哪个地址会被访问。这些只有运行的时候才知道。」
「硬体预测虽然有猜错的风险,但大部分情况下它猜很快、很准。安腾把宝全押在编译器上,结果很多现实场景下,指令并行度根本排不起来,性能上不去,兼容性又差,最後被am和英特尔自己的86架构打没有还手之力。」
沈亢若有所思:「所以,预测执行虽然会猜错,但还是比不预测强。」
萧伯年说:「对。预测执行是拿『可能猜错的代价』换『大概率猜对的收益』。从工业界最终的胜出结果来看,这条路走对了。」
本章未完,请点击下一页继续阅读!