论文部分内容阅读
最近华为Mate 9以及其所采用的麒麟960处理器吸引了不少目光,其中后者的性能和功耗表现都令人满意。在它出色表现的背后,离不开Cortex-A73架构的支持。那么究竟Cortex-A73有哪些改善和进步?它和Cortex-A72又有什么不同呢?今天本文就要带你一起深入了解Cortex-A73。
Cortex-A73,这个代号“Artemis”的架构是ARM最新推出的处理器核心架构。从实际产品的角度来看,Cortex-A73相比之前就已经比较成功的Cortex-A72而言,在性能和功耗表现上继续改善,尤其是性能功耗比有極为显著的提升。那么,为什么ARM要在Cortex-A72发布后没多久就发布Cortex-A73呢?要了解这个问题,不妨先来简单回顾一下ARM最近数年的产品发展史,让历史告诉我们答案。性能?功耗?亦或性能功耗比?回顾ARM近期发展史
在Cortex-A73出现之前,ARM的Cortex-A72在性能和功耗上的表现已然比较出色了。但Cortex-A72从Cortex-A57那里继承来的“问题”依旧存在——它还是太“大”了一点。Cortex-A72整体性能功耗比的表现受制于架构问题,除非工艺再次进化,否则很难有更进一步的改善。为了更清楚地解释这个结论,我们不妨回头看TARM之前几款产品的发展历史。
对ARM架构发展历史比较熟悉的用户应该还记得,Cortex-A9是一款非常成功的移动CPU架构,它在当时的制程下很好地平衡了功耗和性能,相当一大批移动设备都基于Cortex-A9研发,其中有名的处理器包括三星Exynos 4412、Exynos 4210以及TI OMAP4430/4460、英伟达Tegra 3等。
Cortex-A9的成功,让ARM在追求性能的道路上越走越远,并在不久之后推出了Cortex-A15。从性能角度来看Cortex-A15的表现的确令人满意,它的IPC得到了显著提升。但随之而来的是更高的功耗和较低的性能功耗比(当然也有受制于工艺的原因)。与此相应的是,基于Cortex-A15架构的初代SoC芯片,比如Exynos 5250和Exynos5410在功耗方面表现不佳。
在这种情况下,ARM设计出了创新的big.LITTLE架构,希望通过高性能高功耗的大核心搭配高性能功耗比但是整体性能较差的小核心来提高系统整体的性能功耗比,最终实现降低功耗、延长设备使用时间的目的。big.LITTLE的推出,很快得到了移动处理器厂商的欢迎,大量使用Cortex-A15搭配cortex-A7的处理器出现,包括华为麒麟920和三星的Exynos 5422。
ARM此时还没有深刻地认识到处理器的性能功耗比实际上是移动设备的核心竞争力,毕竟此时工艺尚有更多潜力可挖。于是,ARM按部就班地发布了全新的ARMv8指令集,这是ARM第一个支持64位计算的指令集,与此同时还有支持64位的Cortex-A57大核心和高效能的小核心Cortex-A53。本来在ARM的计划中,cortex-A57会用上16nm甚至更好的工艺,不过苹果凭借Cyclone架构带来的64位A7处理器让业界风向为之一转,大量厂商不得不在提前使用cortex-A57和cortex-A53来“抵抗”苹果突然来袭的64位处理器。
结果在当时28n m/20n m工艺下,Conex-A57的性能功耗比非常糟糕。在初步的尝试中,高功耗等问题使得很多厂商不得不弃用cortex-A57,包括华为麒麟930、联发科Helio X10都只使用了Cortex-A53。凡是使用了cortex-A57的核心,比如骁龙810或者骁龙808、Eynxos 5433等,实际表现均相比前代产品有一定退步,尤其是在功耗效率方面甚至大幅度倒退。
在这种情况下,ARM不得不继续修修补补,推出了更为重视性能功耗比的Cortex-A72核心,高通等厂商则自行研发了Kyro架构,不再使用ARM能耗比较低的公版架构。CortexoA72的推出以及16nm/14nm等先进工艺的使用,才使得移动处理器拜托了之前“大火炉”危机。
实际上,我们在讨论的时候,忽略了两个重要的型号:Cortex-A12和Cortex-A17。其中前者是Cortex-A9的改进型产品,后者则是Cortex-A12的深入改进型,原因是Cortex-A12不支持当时ARM主推的big.LITTLE技术,Cortex-A17支持了新技术并可以和Cortex-A7搭配成大小核心。按理来说,如果苹果没有那么快推出64位A7处理器,Cortex-A17应该会被诸多厂商接纳并发布不少新品。从当时的状况来看,Cortex-A17是比较符合当时的工艺发展的。市面上相应的产品有Rockchip RK3288、海思Hi3536,以及联发科的MT6595等。从一些测试结果来看,MT6595在当时的频率和工艺下都给出了相当出色的性能、功耗表现,甚至超过了高通那颗著名的骁龙800处理器(当然也远胜骁龙810)。
Cortex-A17能够在工艺小幅度落后的情况下还提供更高的性能功耗比,显然这是一个不寻常的事件。事出反常必有妖。在这里,还需要梳理一下多年来ARM这些处理器架构的来源,看看是否能找到一些苗头。
从ARM的发展历史中可以看出,ARM拥有多个CPU架构设计中心,面向不同的用户推出不同的架构家族。其中,位于美国德克萨斯州的奥斯丁设计团队发布了cortex-A15、Cortex-A57、CoRex-A72,从本刊之前的介绍和实际架构来看,奥斯丁家族的架构具有一脉相承的特性。另外一个地方则是英国剑桥,ARM剑桥设计团队在这里设计了打造了著名的小核心产品,包括Cortex-A5、Cortex-A7和Cortex-A53。最后一个地方就没那么有名了——位于法国的索菲亚·安迪波斯利,欧洲科技中心,推出了Cortex-A12、Cortex-A17和Cortex-A73。如果从血缘关系来看的话,索菲亚家族的处理器架构才是之前大获成功的Cortex-A9的正统继承人。 现在终于真相大白,Cortex-A73和之前的处理器都不太一样。ARM在Cortex-A9后数代产品都选择了奥斯丁家族,现在终于回到了索菲亚家族。下面我们就一起来看看,索菲亚家族的Cortex-A73优势在哪里,凭什么能压倒奥斯丁家族,被ARM选中而“上位”。
CorteX-A73架构——为实现更高的性能功耗比而努力
从上面的回顾中可以看到,ARM在处理器发展的过程中一度更为偏向性能,对功耗的重视程度并没有放在首要位置,尤其是在早期制程尚能“抵消”更大的核心带来的更高功耗时。不过现在这样的情况已经发生了变化(尤其是制程進步远没有之前那样容易),ARM不但更重视功耗,而且还提出了一种全新的性能考量方法,那就是“可持续性能”。
所谓可持续性能,是指处理器在较高性能输出状态时所能持续的时间。目前很多SoC芯片的峰值性能表现都非常好,但是这些峰值性能的功耗表现甚至超过5W,而一些极端SoC则超过10W,这显然是一个完全无法持续的状态,大部分手机在峰值性能下只能维持几分钟就必须降频甚至关闭数个大核心,无法提供持续的性能输出。这样一来,更高性能产品存在的意义就被严重削弱了,尤其是设备商为了更好看、更吸引人的设计还在努力将手机造得更加轻薄。所以让手机拥有高可持续性能就变得极为重要,Cortex-A73的意义就在于此,ARM通过这个全新的架构在降低功耗、提升能耗效率和维持较高峰值性能的同时还能保持和之前Cortex-A72基本相当的IPC。
在解析Cortex-A73之前,我们先来回顾一下Cortex-A72的架构情况。Cortex-A72是一个拥有超过15级流水线、乱序执行能力的处理器。在指令端,Cortex-A72设计了一个128bit提取单元和一个三发射解码级。每个周期将有最多3个指令被解码为uops(微指令),然后将这些指令送入Rename/Dispatch(重命名,调度)阶段,调度单元每个周期能够实现5个uops的调度,最终通过IsQ单元派送7个队列并安排排序后的uops进入8个执行管道。在这8个执行管道中,有2个执行诸如加法和位移这类基本操作的ALU(Simple Integer |0和Simple Integer|1),整数的乘法、除法和乘法累加运算有专门的多周期整数流水线(Mu…Cycle M),还有专门对ASIMD以DNENO这样浮点运算进行处理的两个管线(NENO/FP FO和NENO/FP F1),还有单个分支监视器(Branch B)以及两个专用的AGU读取和存储单元(AGU LD和AGU ST)。
再来看Cortex-A73。从Cortex-A73的架构图可以发现它和Conex-A17相似度非常高,这和Cortex-A72三发射设计架构完全不同。Cortex-A73微体系结构的特点在于流水线级数较短,只有大约11~12级,较短的流水线主要来自于对整个流程的优化。与Cortex-A72在指令提取端的5级流水线相比,Cortex-A73的指令提取端只有4级。更值得一提的是,Cortex-A73较短的指令解码端只有一级,这使得绝大多数指令能够在一个周期内完成,而不是Cortex-A72的三个周期。在指令执行阶段,只有浮点指令需要额外增加一个周期,也就是总计需要12级流水线,其余整数部分只需要11个周期就可以完成。
与Cortex-A17相比,Cortex-A73将最大的指令调度能力从4uops提高到了60ps,FP解码端可以独立向IsQ单元和NENO单元发出2uops指令,这和Cortex-A17是一致的。但是整数部分却从Cortex-A17的2uops增加到74uops,经过重命名,调度的指令进入指令排序时,三个IsQ单元每个都可以派送2个队列,从而进入后端的5个整数执行单元中。
再来看看Cortex-A73的后端,它有两个FP流水线,这一设计也被Cortex-A72借鉴学习并应用在自己的架构中。其余部分Cortex-A73设计了一个分支检测器和两个AGU单元——但是每个AGU单元都可以同时完成读写操作,而不是像Cortex-A72那样只读或者只写。此外在整数执行部分,Cortex-A73设计了两个4级、较复杂的整数单元,其中一个可以执行乘法,另一个可以执行整数除法,这两个都能够执行基本的加法和位移操作。乘法累加不再使用专门的ALU,而需要这两个ALU通力合作。
对比Cortex-A73和Cortex-A72大相径庭的设计风格,正如ARM宣称的那样,Cortex-A73是一个充分优化管道、资源和接口的架构,它的目的是尽可能在最小的功耗下实现最佳的性能。ARM还宣称它们对AArch32和AArch64 ARMv8做出了平衡,因此在执行不同命令时性能和功耗都不会有太大的劣势。
说完了核心,再来看看集群。Cortex-A73可以支持四核心配置,每个集群能够容纳一个到四个核心,ARM依旧使用SCU一致性单元来保证集群中核心之间的一致性。集群的包含式L2缓存最高可配置8M B(包括L1缓存的数据),和Cortex-A17一样,是Cortex-A72的两倍,当然大部分消费级产品最多配置1MB或者2MB的L2缓存。
附加功能方面,ACP的加速一致性端口是可选配置,移动设备一般不会配备。ACP主要用于附加模块和CPU核心共同运作,同时也可以利用L2高速缓存。传统应用中往往和网络相关,但在移动计算中这一点并不重要。反倒是ARM目前比较关注机器学习和计算机视觉在未来的发展潜力,专门的加速器能够提高平台的效能。
由于Cortex-A73主要针对消费市场,因此它不支持AMBA 5 CHI标准,而是仅仅通过双向128bit的AMBA 4 ACE标准。相比之下,老标准抛弃了那些用不到的功能,为芯片节省了面积和晶体管,降低了复杂性。目前所有支持big.LITTLE架构的SoC都使用了ACE接口相连并保持一致性,比如CCI-400。此外,不针对工业应用标准的另一个问题是无法提供L1缓存的ECC校验支持,但是L2可以完全实现这个功能,因此这也变得不是那么必要。探寻Cortex-A73更底层的秘密 前面从架构设计角度解释了Cortex-A73的优势。下面我们更深入地从指令方面去探寻Cortex-A73的秘密。Cortex-A73的指令端设计为保持对核心的最大吞吐量才能实现最佳的IPc,这是微架构设计最重要的方面;同时,ARM还必须考虑到功耗因素,在设计上有所取舍。ARM称Cortex-A73的设计为“基于槽的微架构”(Slot-based microarchitectures),这种设计和微架构对不同块之间处理共享资源的方式有关。正如ARM解释的那样,Cortex-A73拥有8个“槽”(slot),每个槽可以独立处理指令端的所有資源。主要优点是每个“槽”可以通过小环路来检测之前“槽”的信息,这样能够消除对流水线指令端资源的冗余访问,实现最佳功耗比,并且每个“槽”都拥有大量资源以获得最佳性能。
指令预取模块经过优化,提升了其最大吞吐量。其中一项优化是用于去除无用的“气泡”并可以获得更高的IPC。所谓“气泡”,是指那些可能存在的危险导致流水线发生指令停滞或者延迟。在之前的微架构中,即使预测正确,并且指令端能够向解码端发送大量的指令,但一旦指令输入解码端并被分解成微操作的时候,就有很大可能遇到“气泡”。但是Cortex-A73的设计可以检测这种情况,并直接将微指令发送给解码端,导致ARM中几乎没有“气泡”出现,大大提高了效率。
在分支预测方面,cortex-A73使用了一种“体现最高水准”的分支预测器,实现了比较准确的分支预测。ARM宣称新架构拥有一个更大的BTAC(分支目标地址缓存,Branch TargetAddress Cache),并引入了全新的64通路(entry)的“micro-BTAC”用于加速分支预测。不过,ARM没有公布更多的细节,只是含糊说新的分支预测设计能够预测几乎所有情况。对于那些发生了错误的预测,微架构设置了静态分支预测器和返回堆栈来进行处理。
ARM有信心在这种双发射的处理器上保持性能的同时提高效率。在电源管理方面,电源只对当前正在运行资源的逻辑有效。解码器在指令融合方面也提供了显著的改进。一般来说,常用习惯用法的指令融合处理对提高整体效能来说是非常重要的,但是检测它们却很困难。Cortex-A73能够通过检测之前的事件和整个管线的信息,来分辨出这些习惯用法。
在解码端,将指令分解为更多的微指令有助于时钟频率,不过也相应地减少了整体的IPC。Cortex-A73能够减少被分成的uops数量,并且改进了解码器性能。正如前文所说,Cortex-A73的解码器能够在一个时钟周期内完成大多数指令解码,而不是之前Cortex-A72所需的3个周期。另外由于为ASMID/NENO浮点管线增加了流水线级数,因此ARM为其配备了两个可以直接读/写的AGU单元,实现效率最大化。在指令分派端,Cortex-A73保留站的整数部分可以向为ALU、AGU和分支监视器设置的IsQ单元发布队列,最多分派4个uops(每个IsQ最多接收2个)。
寄存器方面,Cortex-A72以及前代产品最重要的特点是使用物理寄存器而不是在架构类型的,这样做的优点是重命名阶段会简化,并实现更高的性能、降低功耗。和Cortex-A17类似的是,这种做法允许一个理论上无限乱序指令的窗口,虽然实际中依旧存在限制,但它消除了某些情况下的指令窗口瓶颈。ARM甚至宣称这种设计为“乱序微架构方法哲学层面的变革”。另外,Cortex-A73还特别优化了从重命名阶段到IsQ阶段的资源问题。IsQ阶段所使用的乱序执行策略和方法对最终性能有很大影响,因此需要特别注意有关指令调度问题,比如队列的排序可以取决于很多种事件,举例来说当处在一个流式任务时,最好将昕有的存储任务依次排列,这样内存系统中将存在一个完整的缓存数据结构,以方便处理。
在数据端,Cortex-A73的NEN0单元基本还是继承自Cortex-A72,但依旧做出了不少改进。在Cortex-A73上,NENO指令级单元混杂了FP传输和FP移动等功能,并且面积进行了一些优化,更小巧了。实际上,Cortex-A73和Cortex-A72的区别主要在于整数部分,前者使用了一个复杂的、多周期ALU,而后者则使用了简单ALU。它们能力存在显著差异:Cortex-A73中,一个ALU做乘法时,另一个可以做除法,但是乘法累积则需要两个ALU同时出现。在Cortex-A72上,乘法累积有专门的单元操作,ALU则可以解放出来进行其他简单工作。实际上Cortex-A73的设计对一些并行计算和杂项数据处理还是有意义的,尤其是最大执行吞吐量已经翻倍的情况下,效能会更为出色一些。
最后来看看存储方面。在数据高速缓存地址转换上,Cortex-A73已经从物理索引物理标签(PIPT)切换至虚拟地址物理标签(VIPT)。在PIPT中,遇到的最大问题是地址转换产生索引,这是cPu核心的关键路径数据。但是在VIPT中,这个问题不复存在,系统使用扩展的64KB数据缓存(Cortex-A72和Cortex-A17只允许32KB),ARM宣称较大的缓存带来了4%的性能提升。另一点需要指出的是,一般VIPT中软件需要处理重命名的问题,但是ARM称Cortex-A73使用硬件完成了这一点。在硬件上,缓存实现的是4路关联性,但是在软件上则看作PIPT的8路32KB或者16路64KB,这一点是非常特殊的。
在缓存部分,cortex-A73的L1缓存为4路设计且固定为64KB,这是对之前Cortex-A17 1-32KB/64KB可选配置的升级,也多于Cortex-A72的48KB。L1指令缓存的提升是Cortex-A73在性能上得到改善的一个关键性因素,ARM表示他们花费了很多时间来优化指令缓存的性能和功耗。其中一个例子是访问缓存的方式,如果正在执行的一个访问请求实际上是不需要传递数据的,那么这个访问可以被终止,起到节约能源的作用。在L2方面,ARM改善了CPU之间的资源共享销量,每个CPU都有自己单独的资源,单独的CPU数据流不会为其他cPu核心带来性能影响,因此并行计算时CPU性能不会发生损失。 在读写方面,Cortex-A73的两个AGU读写单元,这个设计对提高系统效能起到了很明显的作用,尤其是存储系统。在内存带宽方面,Cortex-A73对TLB进行了改进。在之前的微架构中,当需要切换到主要TLB时,数据集的存在会导致性能下降,Cortex-A73通过为TLB提供自己的预存器来解决了这个问题,即使对于数据集也能实现可持续的流式传输。
Cortex-A73的性能和功耗表现
在架构上说了这么多,最终还是要落在实际的性能和功耗上来。ARM给出了一些官方模拟的数据,展示Cortex-A73可以带来怎样的提升。ARM宣称Cortex-A73在BBench(网站加载基准测试)、SIMD性能以及内存性能方面,比Cortex-A72有着5%-15%的性能提升。
当然,由于Cortex-A73的解码发射宽度降低至双发射,因此在某些情况下相比三发射的Cortex-A72,性能可能有所下降,比如在Dhrystone这样偏重于微观角度的测试软件中。但是ARM宣称Cortex-A73的SPEc性能将和Cortex-A72相当,所以其性能还是值得期待。
功耗方面,这也是Cortex-A73的最大改进。ARM的数据表示Cortex-A73在整数、浮点和L2缓存复制方面都有了显著下降,综合下来相比Cortex-A72节约了大约200的功耗。当然这里面还有一些硬件因素,比如时钟门控技术的更新、硬件控制电路的加强等。
最后ARM还展示了新工艺下的Cortex-A73在面积方面的改善。ARM宣称在即将到来的10nm工艺下,Cortex-A73相比20nm的Cortex-A57降低了大约70%的面积,相比16nm的Cortex-A72面积减少了46%。在相同的工艺下,相比Cortex-A72降低25%的面积。另外,ARM还比较了目前比较流行的八核心Cortex-A53架构,ARM宣称在相同的面积下可以实现2个Codex-A73搭配4个Codex-A53,这样搭配的多核心性能能够提升30%,单核性能能够提高最多90%。
写在最后
可以说,Cortex-A73依靠和Cortex-A72相当甚至更强的性能,但是却更低的功耗、更高的性能功耗比成功站上了移动世界新王者的地位。目前华为麒麟960已经开始使用Cortex-A73架构,性能表现非常出色。在16nm工艺下,麒麟960能够运行在2.3GHz,相信未来换用更先进的工艺后,频率、性能還会进一步拔高。相信接下来诸如高通、联发科等厂商也会快速跟上,在未来的新处理器中使用Cortex-A73架构。
现在还有一个新问题:依然有cortex-A73如此优秀的公版架构存在,是否还有厂商会花大力气自研架构呢?我们看到苹果A系列SoC自从Cortex-A92后就再没有使用过公版架构,高通有自己的Kyro,三星也研发出了Mongoose。这些内核和Cortex-A73有什么差别呢?孰优孰劣呢?未来我们将进一步研究这些内容,并在合适的时候和大家一起讨论。
总的来看,Cortex-A73基本实现了ARM改善移动SoC“可持续性能”的目的,在功耗、性能上实现了新的平衡,法国索菲亚团队也证明了自己的卓越和成功。从性能到性能功耗比,ARM利用Cortex-A73实现了自己的改变。
Cortex-A73,这个代号“Artemis”的架构是ARM最新推出的处理器核心架构。从实际产品的角度来看,Cortex-A73相比之前就已经比较成功的Cortex-A72而言,在性能和功耗表现上继续改善,尤其是性能功耗比有極为显著的提升。那么,为什么ARM要在Cortex-A72发布后没多久就发布Cortex-A73呢?要了解这个问题,不妨先来简单回顾一下ARM最近数年的产品发展史,让历史告诉我们答案。性能?功耗?亦或性能功耗比?回顾ARM近期发展史
在Cortex-A73出现之前,ARM的Cortex-A72在性能和功耗上的表现已然比较出色了。但Cortex-A72从Cortex-A57那里继承来的“问题”依旧存在——它还是太“大”了一点。Cortex-A72整体性能功耗比的表现受制于架构问题,除非工艺再次进化,否则很难有更进一步的改善。为了更清楚地解释这个结论,我们不妨回头看TARM之前几款产品的发展历史。
对ARM架构发展历史比较熟悉的用户应该还记得,Cortex-A9是一款非常成功的移动CPU架构,它在当时的制程下很好地平衡了功耗和性能,相当一大批移动设备都基于Cortex-A9研发,其中有名的处理器包括三星Exynos 4412、Exynos 4210以及TI OMAP4430/4460、英伟达Tegra 3等。
Cortex-A9的成功,让ARM在追求性能的道路上越走越远,并在不久之后推出了Cortex-A15。从性能角度来看Cortex-A15的表现的确令人满意,它的IPC得到了显著提升。但随之而来的是更高的功耗和较低的性能功耗比(当然也有受制于工艺的原因)。与此相应的是,基于Cortex-A15架构的初代SoC芯片,比如Exynos 5250和Exynos5410在功耗方面表现不佳。
在这种情况下,ARM设计出了创新的big.LITTLE架构,希望通过高性能高功耗的大核心搭配高性能功耗比但是整体性能较差的小核心来提高系统整体的性能功耗比,最终实现降低功耗、延长设备使用时间的目的。big.LITTLE的推出,很快得到了移动处理器厂商的欢迎,大量使用Cortex-A15搭配cortex-A7的处理器出现,包括华为麒麟920和三星的Exynos 5422。
ARM此时还没有深刻地认识到处理器的性能功耗比实际上是移动设备的核心竞争力,毕竟此时工艺尚有更多潜力可挖。于是,ARM按部就班地发布了全新的ARMv8指令集,这是ARM第一个支持64位计算的指令集,与此同时还有支持64位的Cortex-A57大核心和高效能的小核心Cortex-A53。本来在ARM的计划中,cortex-A57会用上16nm甚至更好的工艺,不过苹果凭借Cyclone架构带来的64位A7处理器让业界风向为之一转,大量厂商不得不在提前使用cortex-A57和cortex-A53来“抵抗”苹果突然来袭的64位处理器。
结果在当时28n m/20n m工艺下,Conex-A57的性能功耗比非常糟糕。在初步的尝试中,高功耗等问题使得很多厂商不得不弃用cortex-A57,包括华为麒麟930、联发科Helio X10都只使用了Cortex-A53。凡是使用了cortex-A57的核心,比如骁龙810或者骁龙808、Eynxos 5433等,实际表现均相比前代产品有一定退步,尤其是在功耗效率方面甚至大幅度倒退。
在这种情况下,ARM不得不继续修修补补,推出了更为重视性能功耗比的Cortex-A72核心,高通等厂商则自行研发了Kyro架构,不再使用ARM能耗比较低的公版架构。CortexoA72的推出以及16nm/14nm等先进工艺的使用,才使得移动处理器拜托了之前“大火炉”危机。
实际上,我们在讨论的时候,忽略了两个重要的型号:Cortex-A12和Cortex-A17。其中前者是Cortex-A9的改进型产品,后者则是Cortex-A12的深入改进型,原因是Cortex-A12不支持当时ARM主推的big.LITTLE技术,Cortex-A17支持了新技术并可以和Cortex-A7搭配成大小核心。按理来说,如果苹果没有那么快推出64位A7处理器,Cortex-A17应该会被诸多厂商接纳并发布不少新品。从当时的状况来看,Cortex-A17是比较符合当时的工艺发展的。市面上相应的产品有Rockchip RK3288、海思Hi3536,以及联发科的MT6595等。从一些测试结果来看,MT6595在当时的频率和工艺下都给出了相当出色的性能、功耗表现,甚至超过了高通那颗著名的骁龙800处理器(当然也远胜骁龙810)。
Cortex-A17能够在工艺小幅度落后的情况下还提供更高的性能功耗比,显然这是一个不寻常的事件。事出反常必有妖。在这里,还需要梳理一下多年来ARM这些处理器架构的来源,看看是否能找到一些苗头。
从ARM的发展历史中可以看出,ARM拥有多个CPU架构设计中心,面向不同的用户推出不同的架构家族。其中,位于美国德克萨斯州的奥斯丁设计团队发布了cortex-A15、Cortex-A57、CoRex-A72,从本刊之前的介绍和实际架构来看,奥斯丁家族的架构具有一脉相承的特性。另外一个地方则是英国剑桥,ARM剑桥设计团队在这里设计了打造了著名的小核心产品,包括Cortex-A5、Cortex-A7和Cortex-A53。最后一个地方就没那么有名了——位于法国的索菲亚·安迪波斯利,欧洲科技中心,推出了Cortex-A12、Cortex-A17和Cortex-A73。如果从血缘关系来看的话,索菲亚家族的处理器架构才是之前大获成功的Cortex-A9的正统继承人。 现在终于真相大白,Cortex-A73和之前的处理器都不太一样。ARM在Cortex-A9后数代产品都选择了奥斯丁家族,现在终于回到了索菲亚家族。下面我们就一起来看看,索菲亚家族的Cortex-A73优势在哪里,凭什么能压倒奥斯丁家族,被ARM选中而“上位”。
CorteX-A73架构——为实现更高的性能功耗比而努力
从上面的回顾中可以看到,ARM在处理器发展的过程中一度更为偏向性能,对功耗的重视程度并没有放在首要位置,尤其是在早期制程尚能“抵消”更大的核心带来的更高功耗时。不过现在这样的情况已经发生了变化(尤其是制程進步远没有之前那样容易),ARM不但更重视功耗,而且还提出了一种全新的性能考量方法,那就是“可持续性能”。
所谓可持续性能,是指处理器在较高性能输出状态时所能持续的时间。目前很多SoC芯片的峰值性能表现都非常好,但是这些峰值性能的功耗表现甚至超过5W,而一些极端SoC则超过10W,这显然是一个完全无法持续的状态,大部分手机在峰值性能下只能维持几分钟就必须降频甚至关闭数个大核心,无法提供持续的性能输出。这样一来,更高性能产品存在的意义就被严重削弱了,尤其是设备商为了更好看、更吸引人的设计还在努力将手机造得更加轻薄。所以让手机拥有高可持续性能就变得极为重要,Cortex-A73的意义就在于此,ARM通过这个全新的架构在降低功耗、提升能耗效率和维持较高峰值性能的同时还能保持和之前Cortex-A72基本相当的IPC。
在解析Cortex-A73之前,我们先来回顾一下Cortex-A72的架构情况。Cortex-A72是一个拥有超过15级流水线、乱序执行能力的处理器。在指令端,Cortex-A72设计了一个128bit提取单元和一个三发射解码级。每个周期将有最多3个指令被解码为uops(微指令),然后将这些指令送入Rename/Dispatch(重命名,调度)阶段,调度单元每个周期能够实现5个uops的调度,最终通过IsQ单元派送7个队列并安排排序后的uops进入8个执行管道。在这8个执行管道中,有2个执行诸如加法和位移这类基本操作的ALU(Simple Integer |0和Simple Integer|1),整数的乘法、除法和乘法累加运算有专门的多周期整数流水线(Mu…Cycle M),还有专门对ASIMD以DNENO这样浮点运算进行处理的两个管线(NENO/FP FO和NENO/FP F1),还有单个分支监视器(Branch B)以及两个专用的AGU读取和存储单元(AGU LD和AGU ST)。
再来看Cortex-A73。从Cortex-A73的架构图可以发现它和Conex-A17相似度非常高,这和Cortex-A72三发射设计架构完全不同。Cortex-A73微体系结构的特点在于流水线级数较短,只有大约11~12级,较短的流水线主要来自于对整个流程的优化。与Cortex-A72在指令提取端的5级流水线相比,Cortex-A73的指令提取端只有4级。更值得一提的是,Cortex-A73较短的指令解码端只有一级,这使得绝大多数指令能够在一个周期内完成,而不是Cortex-A72的三个周期。在指令执行阶段,只有浮点指令需要额外增加一个周期,也就是总计需要12级流水线,其余整数部分只需要11个周期就可以完成。
与Cortex-A17相比,Cortex-A73将最大的指令调度能力从4uops提高到了60ps,FP解码端可以独立向IsQ单元和NENO单元发出2uops指令,这和Cortex-A17是一致的。但是整数部分却从Cortex-A17的2uops增加到74uops,经过重命名,调度的指令进入指令排序时,三个IsQ单元每个都可以派送2个队列,从而进入后端的5个整数执行单元中。
再来看看Cortex-A73的后端,它有两个FP流水线,这一设计也被Cortex-A72借鉴学习并应用在自己的架构中。其余部分Cortex-A73设计了一个分支检测器和两个AGU单元——但是每个AGU单元都可以同时完成读写操作,而不是像Cortex-A72那样只读或者只写。此外在整数执行部分,Cortex-A73设计了两个4级、较复杂的整数单元,其中一个可以执行乘法,另一个可以执行整数除法,这两个都能够执行基本的加法和位移操作。乘法累加不再使用专门的ALU,而需要这两个ALU通力合作。
对比Cortex-A73和Cortex-A72大相径庭的设计风格,正如ARM宣称的那样,Cortex-A73是一个充分优化管道、资源和接口的架构,它的目的是尽可能在最小的功耗下实现最佳的性能。ARM还宣称它们对AArch32和AArch64 ARMv8做出了平衡,因此在执行不同命令时性能和功耗都不会有太大的劣势。
说完了核心,再来看看集群。Cortex-A73可以支持四核心配置,每个集群能够容纳一个到四个核心,ARM依旧使用SCU一致性单元来保证集群中核心之间的一致性。集群的包含式L2缓存最高可配置8M B(包括L1缓存的数据),和Cortex-A17一样,是Cortex-A72的两倍,当然大部分消费级产品最多配置1MB或者2MB的L2缓存。
附加功能方面,ACP的加速一致性端口是可选配置,移动设备一般不会配备。ACP主要用于附加模块和CPU核心共同运作,同时也可以利用L2高速缓存。传统应用中往往和网络相关,但在移动计算中这一点并不重要。反倒是ARM目前比较关注机器学习和计算机视觉在未来的发展潜力,专门的加速器能够提高平台的效能。
由于Cortex-A73主要针对消费市场,因此它不支持AMBA 5 CHI标准,而是仅仅通过双向128bit的AMBA 4 ACE标准。相比之下,老标准抛弃了那些用不到的功能,为芯片节省了面积和晶体管,降低了复杂性。目前所有支持big.LITTLE架构的SoC都使用了ACE接口相连并保持一致性,比如CCI-400。此外,不针对工业应用标准的另一个问题是无法提供L1缓存的ECC校验支持,但是L2可以完全实现这个功能,因此这也变得不是那么必要。探寻Cortex-A73更底层的秘密 前面从架构设计角度解释了Cortex-A73的优势。下面我们更深入地从指令方面去探寻Cortex-A73的秘密。Cortex-A73的指令端设计为保持对核心的最大吞吐量才能实现最佳的IPc,这是微架构设计最重要的方面;同时,ARM还必须考虑到功耗因素,在设计上有所取舍。ARM称Cortex-A73的设计为“基于槽的微架构”(Slot-based microarchitectures),这种设计和微架构对不同块之间处理共享资源的方式有关。正如ARM解释的那样,Cortex-A73拥有8个“槽”(slot),每个槽可以独立处理指令端的所有資源。主要优点是每个“槽”可以通过小环路来检测之前“槽”的信息,这样能够消除对流水线指令端资源的冗余访问,实现最佳功耗比,并且每个“槽”都拥有大量资源以获得最佳性能。
指令预取模块经过优化,提升了其最大吞吐量。其中一项优化是用于去除无用的“气泡”并可以获得更高的IPC。所谓“气泡”,是指那些可能存在的危险导致流水线发生指令停滞或者延迟。在之前的微架构中,即使预测正确,并且指令端能够向解码端发送大量的指令,但一旦指令输入解码端并被分解成微操作的时候,就有很大可能遇到“气泡”。但是Cortex-A73的设计可以检测这种情况,并直接将微指令发送给解码端,导致ARM中几乎没有“气泡”出现,大大提高了效率。
在分支预测方面,cortex-A73使用了一种“体现最高水准”的分支预测器,实现了比较准确的分支预测。ARM宣称新架构拥有一个更大的BTAC(分支目标地址缓存,Branch TargetAddress Cache),并引入了全新的64通路(entry)的“micro-BTAC”用于加速分支预测。不过,ARM没有公布更多的细节,只是含糊说新的分支预测设计能够预测几乎所有情况。对于那些发生了错误的预测,微架构设置了静态分支预测器和返回堆栈来进行处理。
ARM有信心在这种双发射的处理器上保持性能的同时提高效率。在电源管理方面,电源只对当前正在运行资源的逻辑有效。解码器在指令融合方面也提供了显著的改进。一般来说,常用习惯用法的指令融合处理对提高整体效能来说是非常重要的,但是检测它们却很困难。Cortex-A73能够通过检测之前的事件和整个管线的信息,来分辨出这些习惯用法。
在解码端,将指令分解为更多的微指令有助于时钟频率,不过也相应地减少了整体的IPC。Cortex-A73能够减少被分成的uops数量,并且改进了解码器性能。正如前文所说,Cortex-A73的解码器能够在一个时钟周期内完成大多数指令解码,而不是之前Cortex-A72所需的3个周期。另外由于为ASMID/NENO浮点管线增加了流水线级数,因此ARM为其配备了两个可以直接读/写的AGU单元,实现效率最大化。在指令分派端,Cortex-A73保留站的整数部分可以向为ALU、AGU和分支监视器设置的IsQ单元发布队列,最多分派4个uops(每个IsQ最多接收2个)。
寄存器方面,Cortex-A72以及前代产品最重要的特点是使用物理寄存器而不是在架构类型的,这样做的优点是重命名阶段会简化,并实现更高的性能、降低功耗。和Cortex-A17类似的是,这种做法允许一个理论上无限乱序指令的窗口,虽然实际中依旧存在限制,但它消除了某些情况下的指令窗口瓶颈。ARM甚至宣称这种设计为“乱序微架构方法哲学层面的变革”。另外,Cortex-A73还特别优化了从重命名阶段到IsQ阶段的资源问题。IsQ阶段所使用的乱序执行策略和方法对最终性能有很大影响,因此需要特别注意有关指令调度问题,比如队列的排序可以取决于很多种事件,举例来说当处在一个流式任务时,最好将昕有的存储任务依次排列,这样内存系统中将存在一个完整的缓存数据结构,以方便处理。
在数据端,Cortex-A73的NEN0单元基本还是继承自Cortex-A72,但依旧做出了不少改进。在Cortex-A73上,NENO指令级单元混杂了FP传输和FP移动等功能,并且面积进行了一些优化,更小巧了。实际上,Cortex-A73和Cortex-A72的区别主要在于整数部分,前者使用了一个复杂的、多周期ALU,而后者则使用了简单ALU。它们能力存在显著差异:Cortex-A73中,一个ALU做乘法时,另一个可以做除法,但是乘法累积则需要两个ALU同时出现。在Cortex-A72上,乘法累积有专门的单元操作,ALU则可以解放出来进行其他简单工作。实际上Cortex-A73的设计对一些并行计算和杂项数据处理还是有意义的,尤其是最大执行吞吐量已经翻倍的情况下,效能会更为出色一些。
最后来看看存储方面。在数据高速缓存地址转换上,Cortex-A73已经从物理索引物理标签(PIPT)切换至虚拟地址物理标签(VIPT)。在PIPT中,遇到的最大问题是地址转换产生索引,这是cPu核心的关键路径数据。但是在VIPT中,这个问题不复存在,系统使用扩展的64KB数据缓存(Cortex-A72和Cortex-A17只允许32KB),ARM宣称较大的缓存带来了4%的性能提升。另一点需要指出的是,一般VIPT中软件需要处理重命名的问题,但是ARM称Cortex-A73使用硬件完成了这一点。在硬件上,缓存实现的是4路关联性,但是在软件上则看作PIPT的8路32KB或者16路64KB,这一点是非常特殊的。
在缓存部分,cortex-A73的L1缓存为4路设计且固定为64KB,这是对之前Cortex-A17 1-32KB/64KB可选配置的升级,也多于Cortex-A72的48KB。L1指令缓存的提升是Cortex-A73在性能上得到改善的一个关键性因素,ARM表示他们花费了很多时间来优化指令缓存的性能和功耗。其中一个例子是访问缓存的方式,如果正在执行的一个访问请求实际上是不需要传递数据的,那么这个访问可以被终止,起到节约能源的作用。在L2方面,ARM改善了CPU之间的资源共享销量,每个CPU都有自己单独的资源,单独的CPU数据流不会为其他cPu核心带来性能影响,因此并行计算时CPU性能不会发生损失。 在读写方面,Cortex-A73的两个AGU读写单元,这个设计对提高系统效能起到了很明显的作用,尤其是存储系统。在内存带宽方面,Cortex-A73对TLB进行了改进。在之前的微架构中,当需要切换到主要TLB时,数据集的存在会导致性能下降,Cortex-A73通过为TLB提供自己的预存器来解决了这个问题,即使对于数据集也能实现可持续的流式传输。
Cortex-A73的性能和功耗表现
在架构上说了这么多,最终还是要落在实际的性能和功耗上来。ARM给出了一些官方模拟的数据,展示Cortex-A73可以带来怎样的提升。ARM宣称Cortex-A73在BBench(网站加载基准测试)、SIMD性能以及内存性能方面,比Cortex-A72有着5%-15%的性能提升。
当然,由于Cortex-A73的解码发射宽度降低至双发射,因此在某些情况下相比三发射的Cortex-A72,性能可能有所下降,比如在Dhrystone这样偏重于微观角度的测试软件中。但是ARM宣称Cortex-A73的SPEc性能将和Cortex-A72相当,所以其性能还是值得期待。
功耗方面,这也是Cortex-A73的最大改进。ARM的数据表示Cortex-A73在整数、浮点和L2缓存复制方面都有了显著下降,综合下来相比Cortex-A72节约了大约200的功耗。当然这里面还有一些硬件因素,比如时钟门控技术的更新、硬件控制电路的加强等。
最后ARM还展示了新工艺下的Cortex-A73在面积方面的改善。ARM宣称在即将到来的10nm工艺下,Cortex-A73相比20nm的Cortex-A57降低了大约70%的面积,相比16nm的Cortex-A72面积减少了46%。在相同的工艺下,相比Cortex-A72降低25%的面积。另外,ARM还比较了目前比较流行的八核心Cortex-A53架构,ARM宣称在相同的面积下可以实现2个Codex-A73搭配4个Codex-A53,这样搭配的多核心性能能够提升30%,单核性能能够提高最多90%。
写在最后
可以说,Cortex-A73依靠和Cortex-A72相当甚至更强的性能,但是却更低的功耗、更高的性能功耗比成功站上了移动世界新王者的地位。目前华为麒麟960已经开始使用Cortex-A73架构,性能表现非常出色。在16nm工艺下,麒麟960能够运行在2.3GHz,相信未来换用更先进的工艺后,频率、性能還会进一步拔高。相信接下来诸如高通、联发科等厂商也会快速跟上,在未来的新处理器中使用Cortex-A73架构。
现在还有一个新问题:依然有cortex-A73如此优秀的公版架构存在,是否还有厂商会花大力气自研架构呢?我们看到苹果A系列SoC自从Cortex-A92后就再没有使用过公版架构,高通有自己的Kyro,三星也研发出了Mongoose。这些内核和Cortex-A73有什么差别呢?孰优孰劣呢?未来我们将进一步研究这些内容,并在合适的时候和大家一起讨论。
总的来看,Cortex-A73基本实现了ARM改善移动SoC“可持续性能”的目的,在功耗、性能上实现了新的平衡,法国索菲亚团队也证明了自己的卓越和成功。从性能到性能功耗比,ARM利用Cortex-A73实现了自己的改变。