泡泡网CPU频道 PCPOP首页      /      CPU     /      评测    /    正文

盖棺定论 2013年手机处理器终极指南

    早在2011年,围绕“Scorpion和Cortex A9到底谁更好”就已经展开过一些争论,随着时间的过去,事实慢慢证明了,Cortex A9的确技高一筹,而Scorpion则不幸成了“高频低能”的形象代言人。前文中我们曾提到,骁龙S4所采用的核心是自行研发的,高通表示这颗处理器的基础架构要远比Cortex A9先进,那么,它算不算ARM新一代架构Cortex A15呢?很显然这一定会引发另一场争论——至少在当时。为了分析这个问题,我们需要深入到架构内部。

    首先看一下规格:3指令发射、乱序执行流水线、3300DMIPS/MHz,的确和Cortex A15很接近。但是实际上Krait核心在大多数时候的表现却和Cortex A9相去不多,这究竟是为什么?答案自然是架构。虽然高通并没有公开Krait的详细架构,但是根据性能表现和一些特征性参数,我们也可以大概猜测一下。

    在开始之前,首先需要来观察一下Cortex A9的架构:

    从逻辑角度说,处理器的工作过程是读取指令->解码指令->分派给执行机构->进行运算->把结果写回内存->读取下一条指令的循环。对应在架构图理,指令从左下角的预取(Prefetch Stage)级进入到上方的解码(Decode Stage)级,经过必要的处理(Register Rename)后,进入乱序指令分发(Dispatch)级,送给各个执行(ALU/NEON)器,最后进入乱序写回(Write back)部分。这一条路径,就是所谓的指令流水线,也就是下面这张图。

    处理器的工作,就是不断读取内存中的应用指令流,然后把它尽可能快的塞进执行流水线。因此吞吐量是一个CPU架构很重要的指标,而吞吐量可以用IPC来衡量,即每周期指令数。Cortex A9的指令解码器(图中De)具备单周期解码两个指令的能力,因此是一个双发射的核心,具备的最大IPC为2。但是光解码没有用,还需要把解码后的指令送入执行流水线才可以真正实现功能,而这是靠乱序指令分派器(图中Iss)实现的。在Cortex A9里,这个部件具备3+1个端口,也就是说总共可以挂接四组执行器,但只能同时分派3个(有一个端口是复用的)。执行单元部有两个通用执行器(其中一个除去整数运算以外还支持并发执行一个硬件乘法运算)、一个访存器和命名为“Compute Engine”的运算协处理器,也就是我们知道的VFP和NEON。

    到了Cortex A15,取指宽度提升到了128bit(Cortex A9只有64bit,后文详述),单周期解码能力增加到了3,也就是说拾取部分的IPC从2增加到了3。为了可以实际发挥它,ARM对Cortex A15的指令分派器与执行管线进行了极大的强化,这也是架构图中变化最大的部分。

    与Cortex A9的3+1分派不同,Cortex A15的分派器具备8指令分派能力,执行器也从3类4组扩充到了5类8组,额外增加了分支跳转单元和硬件乘除法单元,每一组执行器对应的分派端口都有自己的独立队列。Cortex A9上,VFP和NEON要屈尊共享一个分派端口,A15就成功平房换别墅,各自拥有了独立的端口,吞吐量大大提升。

    那么结论是什么?至少从架构上,Cortex A15要远远比Cortex A9先进,两者的设计理念之间差了大约有5年。Cortex A9的架构更接近于老式的,上个世纪90年代的顺序架构处理器,即较少的分派队列、复用的执行管线与简单的多指令并发。当然, ARM在Cortex A9上第一次实现了乱序执行核心,但至少从架构图上看,结果可能也仅仅是支持而已。但Cortex A15不同,在Cortex A15上,才是真正看到了可以从乱序执行中获利的设计,原因很简单,乱序执行的本意是通过打破指令的时间顺序,进而增加处理器硬件资源的利用率。那么就自然需要CPU的分派单元具备足够强大的分派能力和硬件资源,可以尽一切可能去填满所有的执行器,因此体积必然会极大膨胀,最理想的情况就是给每一组执行器都设计一个端口和队列。

    对于这一点,Cortex A15做到了,而Cortex A9没有做到。当然这么设计并不是没有代价。乱序执行需要的资源完全不是顺序架构可以比拟的,毕竟计算机程序的指令之间本身就具备逻辑上的先后顺序,再乱序,也只能是执行时的乱序,最终还是需要一定的顺序,这就需要具备额外的硬件资源去记录指令间的相关性以及时间状态。除此以外,为了保证后续指令可以跳过前面阻塞的指令执行,也需要指令队列有足够的容量去保存阻塞的指令。这之间有很多技术细节,会导致功耗的激增,如何在引入乱序执行核心优势的同时尽可能的去压制住激增的功耗,这需要非常高深的设计功力,甚至有时候需要一定的技巧和运气。Intel曾经也在探索新架构的时候跌了大跟头,ARM没有任何理由可以免费得到这种好处,因此Cortex A15也为此付出了代价。至于代价有多大,留到下篇再说。

    Krait的资料就比较缺乏了,高通一向有保密的传统,所以目前只知道单周期解码能力为3、指令分派能力为4、执行单元一共有7个,仅此而已。但是这已经足够让我们去猜测Krait的设计,关键在于指令分派能力:4,也就是说,Krait的具体架构应当和Cortex A9类似,主要强化的是执行器规模。换句话说,Krait是一个大幅阉割了吞吐量的Cortex A15,或者说是一个大幅提升了“肥胖度”的Cortex A9。原因不用多说,只在省电二字。因此Krait空有接近Cortex A15的3300DMIPS/MHz理论运算能力与3 IPC,却并无法发挥,原因也在这里。单纯增加码头容量和工厂容量,却不提升连接码头和工厂的道路宽度,最终都是白费力气。

    分派之后是执行,执行主要靠一组组的运算与逻辑单元构成。相比Cortex A9,A15增加了硬件乘法器和专门用来处理分支的Branch ALU,而且有迹象标明,Load/Store的性能也得到了很大的加强。这些对于某些情况下的应用性能会带来较大的改变,但更为明显的变化其实是在NEON与VFP上。Cortex A15中这两个SIMD ALU不仅拥有独立的端口,内部还实现了双发乱序执行流水线。

    上图就是Cortex A9的浮点运算单元。它的内部实现了管线化架构设计,拥有自己独立的指令队列和指令分派,但是每个周期只能分派一个指令,执行管线也是单发顺序的。虽然图上没有画出来,但是VFP/NEON指令的具体解码在Cortex A9中是在浮点运算单元中实现的,因此相对于其他的执行管线而言,独立性显得比较明显。

    到了Cortex A15,浮点运算单元被以其他运算器相同的运作方式整合到了处理器的主管线中,具体而言,就是VFP和NEON的指令解码和其它类型的指令一样是在前端指令解码部分直接实现,再由分派器统一分派。再加上内部的双发乱序,Cortex A15的VFP/Neon可以同时执行两条SIMD指令,四个融合MAC运算,运算能力要大大超越Cortex A9。根据现有的资料和实际的运行结果,高通也实现了双发的VFPv4,但是Neon与是否支持乱序则无从判断。可以猜测,Krait的SIMD部分性能可能会弱于Cortex A15。

    作为总结,用一张图来简单比较一下Cortex A9、Krait和Cortex A15的执行管线:

    再好的核心如果得不到数据,也只能停摆,所以缓存是现代处理器设计中一个很重要的部分。多处理器系统的缓存大体上有两种设计思路,一种是每个核心拥有自己独立的缓存,通过外部总线进行一致性维护,例如Pentium D和Atom;另一种是设计一块共享的大缓存,使用总线访问。Cortex A9和A15、Krait都采用了后一种设计,但是细节有所不同。

    Cortex A9的二级缓存通过外部总线连接到处理器组。可以看到,两颗Cortex A9处理器通过标记为PL310的二级缓存控制器连接到1MB的缓存上。PL310的内部结构如下:

    PL310提供了两个AMBA3 AXI接口,宽度都是64bit。结合之前的架构图,可以得到一个八九不离十的推测,那就是这两个接口一个会用作指令拾取,而另一个则用于访问二级缓存。

    这个设计好不好呢?显然是不好的,否则ARM也不会把Cortex A15上的二级缓存控制器直接整合进A15多核心控制器SCU中。这是Cortex A15的一大升级,它的二级缓存不再是一个游离的组件,终于与所有的核心构成了一个紧密耦合的整体。它的好处,后面我们还会详细解释,而它的坏处,我们会在下篇中为大家分析。

    不仅如此,Cortex A15的二级缓存针对多核心访问设计了4个独立的TAG队列,数据的读取和写入由两个不同的接口实现(这里不太确定),还支持直接的CPU到CPU数据传输,这一切都是为了提升多核心下并发访问缓存的性能。Intel曾经说过Cortex A9糟糕的二级缓存性能限制了它的性能,很明显,ARM决心在Cortex A15上改进这个缺陷。

    至于高通S4平台,从高通自己提供的核心框图上看,似乎是采用了一整片L2缓存为所有核心所共享,但是nVIDIA在发布Tegra4的时候给出了一张幻灯片,里面对于Krait的L2缓存有非常清晰的说明:

    很明显,Krait并没有设计为一体式L2缓存,依然保留着早期Scorpion的每颗核心包含自己独立缓存的架构。这是异步架构特有的问题和设计之一,缓存之间需要靠外部接口进行一致性维持,有效容量仅有总容量/核心,对于Krait而言,不论多少个核心,有效二级缓存永远只有512KB。当然,这样的设计拥有高带宽低延迟的好处,毕竟缓存是私有的,这点在对阵Cortex A9的时候会有一定的优势,但是面对Cortex A15就很难说有什么好处了。

    到这里大家应该就明白了,认为Krait是类似于Cortex A15架构的说法是不准确的。事实上,骁龙S4的“Krait”架构相对上代Scorpion而言虽然得到了很大的强化,但距离Cortex A15还有一定的距离,甚至说设计上与Cortex A9的亲缘关系更近,看作是“肥胖版”的Cortex A9也许会更合适一些。这样的架构注定很难发挥它的理论性能。

0人已赞

关注我们

泡泡网

手机扫码关注