预测执行和分支预测
只要流水线连续不断地注入指令,则一切顺利。但是当遇到一个条件分支时会发生什么呢?流水线必须在测试结果揭晓前等待,因此,下一条指令只有在当前指令结束时才能开始。欢迎来到80年代,486时代!这被称为流水线阻塞(pipeline stall),会使流水线的优势荡然无存。由于几乎每个程序都存在大量的if-then-else语句,必须找到解决流水线阻塞问题的办法。
制造商找到的解决方法是:预测执行(speculative execution):与其等待,我们不如通过预测选择执行其中一条分支地指令。假如我们足够幸运,则正好做对了,但是如果没那么幸运,我们就得丢弃刚才推测执行的结果,这样就会遭遇同样的流水线阻塞情形。假设我们随机地选择分支,50%的情况会是正确的,也能极大地提升流水线地吞吐率!
唯一的问题是if语句的分支在可能性上并非等同!在通常情况下,他们甚至是高度不平衡分布的:其中一条是错误处理分支,另一条是正常分支,但是处理器并不知道测试的含义,那么,我们能做些什么呢?解决方案是分支预测:处理器学习代码中的分支能够很好地预测在给定条件下,哪条分支会被执行。
很快问题竟变得如此复杂,不是吗?如果你曾经思考过这些问题,你并不孤单。在不久之前,编程届因幽灵和熔断漏洞的披露而震动,这些漏洞可让攻击者看到未被授权的内存区域的内容。破解的第一步是引诱分支预测器在预测执行时选择错误的分支。当处理器发现不被允许的访问,指令会被暂停执行,但被保护的数据却还在缓存中,可以用一些复杂的技术猜测出来,在此我们不作讨论。这些缺陷对过去十年的处理器优化技术提出了挑战,如果要解决这些缺陷,必然带来相当大的性能损失。
就CPU性能优化而论,我们都对下一代CPU架构如何演化充满好奇,难道不是吗?
网友评论