关于arm:当前CPU的分支预测有多普遍?

How prevalent is branch prediction on current CPUs?

由于对性能的巨大影响,我从不怀疑我今天的桌面CPU是否有分支预测。当然可以。但是各种各样的武器产品呢?iPhone或Android手机有分支预测吗?老任天堂DS?基于PowerPC的WII怎么样?PS 3?

它们是否有一个复杂的预测单元并不那么重要,但是如果它们至少有一些动态的预测,以及它们是否在预期的分支之后执行一些指令。

使用分支预测的CPU的截止点是什么?几十年前的手持计算器显然没有,而我的台式机却有。但是,有谁能更清楚地勾勒出人们期望动态分支预测的地方呢?

如果还不清楚的话,我将讨论一种预测,在这种预测中,条件会发生变化,在运行时改变预期路径。


任何超过几个阶段的管道的CPU都至少需要一些原始分支预测,否则它可能会暂停等待计算结果,以决定要走哪条路。Intel Atom是一个有序的核心,但是有着相当深的管道,因此它需要一个相当不错的分支预测器。

旧的手臂7设计只有三个阶段。将其与分支延迟槽(MIPS上必需的,SPARC上可选的)结合起来,分支预测就没有那么有用了。

顺便说一下,当MIPS决定通过超过4个管道阶段来获得更高的性能时,分支延迟槽就成了一个麻烦。在最初的设计中,这是必要的,因为没有分支预测器。因此,您必须在分支前执行最后一条指令之前对分支指令进行排序。对于较长的管道,他们需要一个分支预测器,避免了分支延迟槽的需要,但为了运行较旧的代码,他们无论如何都必须模拟它。

分支延迟槽的问题是,它只能填充大约50%时间的有用指令。剩下的时间,要么用一条结果可能被丢弃的指令填充它,要么使用no-op。


现代的高端超标量CPU具有很长的管道(这意味着几乎所有的CPU都常见于台式机和服务器中),这些天的分支预测相当复杂。

大多数ARM CPU没有分支预测,这节省了硅和功耗,但ARM CPU通常具有相对较短的管道。另外,对ARM ISA中大多数指令的有条件执行的支持有助于减少所需的分支数(从而降低分支预测失误暂停的成本)。


分支预测越来越重要和重要,而ARM越来越复杂。

例如,新的64位ARM体系结构armv8减少了条件执行的大部分使用(主要是由于指令编码空间限制和寄存器数量的增加),并依赖分支预测来保持性能在可接受的水平。

即使对于较新的ARMV7-A设备,您也可以检查一些可怕的情况,比如SO上的未排序数据问题,哪一个分支预测改进大约是3倍。


您可以在任何无序处理器中期望动态分支预测器,这些处理器不仅依赖于流水线,而且在同一时间获取多个指令,并且它们具有多个执行单元(浮点单元、ALU)、更多寄存器;为了增加指令的执行,您可以在任何给定时刻动态获取多个指令。当然,分支是一个问题,如果你想保持所有的机器利用率高,所以这种处理器,依靠动态分支预测,以保持非常高的吞吐量和利用率。

你可以期望任何一台服务器都有动态的分支预测,也就是台式机,在过去的嵌入式系统中,比如当前智能手机中的ARM芯片没有分支预测,因为它们有更小的管道,并且没有无序的执行,但是摩尔定律给了我们更多的晶体管每个区域,你将开始看到越来越多的P。处理器增加了他们的架构。因此,为了回答您的问题,除了寻找CPU规格之外,您还可以期望对32位的芯片、更大的管道、无序执行进行分支预测。ARM最近的芯片正朝这个方向移动。


对于ARMCortex-A8(虽然它确实有一些分支预测),没有那么多,但是我相信Cortex-A9是无序的超标量,具有复杂的分支预测。