最近ARM推出了高端CPU IP Cortex-A73,一时风起云涌,业界人士纷纷评价。在此,我转载一篇知乎专栏作家大头写的文章,他山之石,可以攻玉,欢迎大家一起讨论,本文已经获得大头的转载授权:
作者:大头链接:https://zhuanlan.zhihu.com/p/21306638来源:知乎
今天在网上偶然看到一篇“ARM新杀器”的文章,介绍ARM最新公布的处理器Cortex-A73,是我目前看到过写的最深入的中文分析了。
正如文章指出的,Cortex-A73是法国团队设计的。一般说到欧洲科技谁最强,大家总觉得是德国。其实未必。ARM是英国公司,剑桥团队设计了Cortex-A53。英国还有罗罗公司,航空发动机领域世界第一。法国也不错,Cortex-A73证明了他的处理器设计能力,而飞机发动机设计能力也处于世界前列。相比之下,感觉德国在电子和机械方面并没有特别尖端的东西。回到处理器,Cortex-A73脱胎于Cortex-A17,后者同样是法国团队设计,性能和功耗做的非常好,是当时的经典之作。可能你从没听过Cortex-A17,那是因为生不逢时,遇上了苹果推出的64位手机处理器,所以大家都转向64位,从而造就了Cortex-A53。这次Cortex-A73卷土重来,应该不会像上次那么惨了吧。
这篇文章有几个地方挺关键:
Power efficiency,two-issue,VIPT,L1D Prefetcher,power-optimized iFetch。
可以在和Cortex-A72同工艺同频时,性能稍稍降低,但是功耗减少20%以上。这对市场可能不是个好事,大家一看和上一代同频,结果性能还降了,肯定要开骂。不过毕竟低了20%功耗,可以稍微升下频率,用高频来弥补性能的遗憾。其实性能不高的原因很简单,就是双发射。对比Cortex-A72的三发射,做到性能基本不降,应该给掌声才对。
Cortex-A73有个特点,它开始使在一级数据缓存上使用VIPT。如果对这个没概念可以去维基百科查下。和之前的PIPT对比,最大的好处是可以同时开始MMU和缓存目录的查找(虚地址索引)。等一个周期之后,目录命中,这时候MMU也把实地址返回,可以直接和TAG进行比较,缩短一个周期的一级缓存访问时间,还减少了查找缓存目录时的逻辑复杂度。后者其实很关键,可以用来提升处理器频率,现在新的处理器频率的关键路径通常就是查找这100-200多条缓存目录的时间,而一级缓存基本都是和处理器同频,不用多周期访问。除此之外,只能靠加压和工艺进步了。而加压会造成功耗2-3次方上升,工艺呢,相对16nm,7nm上基本上也没在最高频率上有多少提升(当然,可以大量使用高漏电的uLVT来提升频率,不过功耗估计就失去7nm的优势了)。Cortex-A73宣传可以在16nm上达到2.8Ghz,而根据我手头的16nm库,我估计加压到1V可以做到3G甚至更高,不过功耗也是吓人,见仁见智吧。
VIPT这么好,为什么以前不用呢?维基百科也提了,因为它会引入一个问题,就是多个虚地址指向同一个实地址时,在缓存内占着多个位置。这对指令缓存没什么,因为它们都是只读的,其中一个被踢出去,另外一个继续保留,也不会有不一致的问题。而在数据缓存中,那就可能造成和下一级缓存内容和状态不一致。而要防止这种情况发生,那就必须把所有的相同物理地址的映射都找出来,而这样一来就相当于要多次查找,非常慢。
曾经看到过一种解决方法。在4K页的时候,虚地址低12位[0-11]和物理地址是一一映射的。假设缓存64KB,8路,缓存行64字节,bit[0-5],那么索引是256条,bit[6-12]。此时bit12用来区分虚实地址的区别,因为[0-11]相同。也就是说,查找索引的时候,只可能有两种不同的虚地址对应一个物理地址。那么我们要不就设成16路,让这种可能在查找目录时消失(不过会让数据查找更慢);要不就分析:如果第一次命中,那么皆大欢喜,如果未命中,那么我们先把查找请求发送到缓存行填充接口(相当于预取),然后同时,在tag ram查找bit12取反的数据。如果找到,那么就取消缓存行填充,此时周期内缓存目录还可以用于新的查找,而tag ram是空闲的,废物利用做了反向查找。找不到也不浪费时间,其结果皆大欢喜。
文章还提到了L1D Prefetcher。数据缓存的预取同样非常重要。如果能够准确预测出将要访问的数据,提前读到缓存,提高效率不言而喻。最早的预取只有一路,如果处理器在做内存拷贝或者连续访问数据结构某元素这类有规律的操作,那么其访问的数据就会被预测并预取。当然,这个和ARM CPU的streaming模式和PLD指令需要做好协调免得冲突。A73使用了多路,同时探测几种访存偏移模式。除了使用多路,我估计还使用了类似指令预测的方法,保存历史信息,推测未来。结合ARM内存控制器能对多主设备的随机地址访问做到90%以上的带宽利用率,我估计他们在预测数据访问和调度的研究应该是有所进展。
文章最后提到了power-optimized slot instruction fetch,高能效的指令预测和抓取,这是ARM的一贯特点,好像自Cortex-A9之后就是这样设计了。指令分支预测已经被人讲滥了,不再多说,而所谓的slot,就是取指的时候,维护着一堆类似指针数组的槽位,每个槽里面放着指向某一段指令的指针(通常是跳转的开头)。然后有一个活动槽,所有的指令预测和抓取逻辑都基于这些槽位。这样做,可以让非活动槽位的相关电路全都暂时关闭,clock gating更容易,从而更省电。
据说今年三四季度就能看到Cortex-A73的手机出来啦。话说回来,商业化的CPU结构早就大同小异了,而GPU的结构每一家都不太一样,异构计算应用也越来越多,我是挺想看看结合Mali-G71和CCI500/550,手机上能不能玩出点新花样。
欢迎大家一起讨论