盖棺定论 2013年手机处理器终极指南
每次提到高通,“异步多核”甚至“胶水多核”都是一个无法回避的问题。对于这个技术,支持者和反对者都很多,之前的文章也有过一定的介绍。当然,实际上那时的介绍并不准确,不过异步架构在手机上坏处大于好处,这点相信还是很容易理解的。
异步架构的好处是什么?当然是省电。异步架构下的CPU不需要运行在同样的频率,甚至不需要拥有同样的实现,完全可以做到一刻核心运行在1.5GHz的全速下,而另一颗核心只运行在384MHz的最低频下。这样以来,高负载的线程,比如前台应用,就可以工作在高负荷的核心上,而诸如系统后台服务这样的低负载线程就可以工作在低频核心下,系统的能耗比得到最大规模的优化。
为了实现这点,高通必须对Linux核心的调度器做修改,因为典型的调度器并不支持非对称调度,它会默认所有的CPU核心具备同样的性能,这会导致低频核心进入严重的阻塞状态,进而影响系统表现。这也是高通称移动领域只有高通做到了这点的原因。
那么异步架构的坏处又是什么?自然是性能。异步架构对于性能的影响在于两个方面,一是异步电路的同步开销,二是非对称调度的调度开销。
不论多么复杂的硬件,深入到最底层,都是功能电路与总线的组合。总线需要协议,协议的基础是时序,因此显而易见的要求就是,连接到一个总线的两个设备之间想要沟通,那么就需要具备同样的时序。换句话说,就是需要拥有同样的频率。这就是同步电路。30年来,同步电路成为了设计领域的主流,围绕其发展的EDA技术也是最成熟的。而异步电路则不同,它拥有一个特殊的“握手协议”,在正式的传输发起之前,会首先利用几个时钟周期的时间进行“握手”,将双方的时序调整到一致。在实际实现中,这个由固化硬件实现的握手协议消耗的时序,根据设计不同在2~4个时钟周期左右,这就是异步电路的同步开销。如果我们考虑最极端的情况,假设真正的数据传输只需要3个时钟周期,那么异步电路的总线利用率就永远不会超过50%,因为至少有一半的时间要消耗在握手上,哪怕两边的频率是相等的。
看到这里,聪明的你应该可以发现问题所在:即便是异步电路,在真正数据传输的时候,依然还是需要两侧时序保持同步,异步握手协议的加入只是做到了通讯发起时双方的时序可以不一致。因此很明显的结论就是,异步总线同一时刻只能与一个设备进行握手。考虑以下状况,如果两个CPU同时向总线发起占用请求,即发起握手请求,而这两个CPU的频率不同,那么很明显,由于时序的不同,任何防止冲突的协议都无法起效,因为逻辑电路的最小工作周期就是时钟周期。因此异步系统里发起握手行为的只能是总线本身,也就是说异步系统里实际上是总线在不断询问CPU是否要接入,而不是CPU向总线要求接入。
既然如此,异步系统就是一个轮询的系统,这是它的另一硬件开销,尤其是在核心数超过2的系统中,由于轮询必然是有顺序的,那么就必然会遇到某一时刻总线轮询到的是CPU0,而此时需要握手的是CPU3。哪怕CPU1和CPU2都是空闲的,CPU3也必须要等到3个总线周期以后才可以和总线同步。假设同步需要3个周期,而数据传输也只需要3个周期,这就意味着在同步系统里只需要4个周期就可以实现的数据请求,在异步系统里消耗了9个周期。
当然,这里讨论的都是最基础的情况,实际设计中也会有很多的技巧去突破这些限制,但是别忘了,如果把总线协议和接口实现的过于复杂,其本身的耗电量也会增加,因此实际设计中可能并不会引入太多复杂的高级设计,因此这些开销可能全都是存在的。
除去硬件设计导致的开销以外,用于配合异步系统正常工作的操作系统调度器,也会引入额外的开销。对于同步系统的调度器而言,由于它假定所有的CPU均拥有同样的运算能力,因此调度算法的实现非常简单,只需要平衡的把负载分配到各个活动CPU上即可。但是一旦各个CPU之间的频率不同,调度器所需要维护的数据结构就会大大复杂化,因为系统需要尽力去保证异步系统处于异步状态,否则就无法实现异步系统省电的特性,因此就不能平均分配工作符合。尤其是考虑到实际的移动设备里,各个CPU核心的频率都是处在动态变化之中的,因此异步系统调度器的算法会明显复杂得多。我们知道,调度器所占用的是一个系统内两个时间片中间的时间,现代系统中时间片一般取10~100毫秒,Linux核心的时间片大体上是100ms左右,根据任务优先级不同而不同,最短可以到5ms。假设同步系统的调度器执行只需要10us,那么在5ms时间片的系统上所消耗的性能就只有0.2%,但是如果调度器消耗的时间为1ms,那么性能损失就会激增到17%左右,影响十分巨大。当然,在实际系统中不太可能使用5ms时间片,异步系统的调度器也不可能需要花1ms的时间才能完成调度,但是异步调度器的确会占用系统不可分片的时间,带来性能的下降。
至此异步系统的好处和坏处都解释清楚了,那么最后的问题就是,异步系统相对于同步系统而言究竟是好处多还是坏处多,这个问题可以分为两个方面来观察。
首先是用户对于性能的需求。异步系统的省电特性是靠牺牲性能获得的。由于同步开销的存在,异步系统发挥非常好的效率的时候是重度计算的情况,在这种情况下,CPU的指令流水线基本处于满负荷工作的状态,而指令拾取与解码往往会因为后端流水线的阻塞而停止。这时对于总线使用率的要求会大大降低,同步开销得以掩盖。但是当用户执行的是轻量级多线程时,由于同步开销的存在,系统的表现会大受影响,因此给人的感觉就是跑分快,实际用却表现不出来,多任务切换的时候甚至会有卡顿的情况,而这正是高通系统的特征。
其次是同步系统也各种有办法减小同步运行的高功耗,其中之一就是对指令流水线引入复杂而精密的时钟门控,在没有指令输入的时候,流水线甚至可以整体关闭时钟,进入彻底的停摆状态,进而降低功耗。这些都是已经成熟的技术,目前大部分CPU设计中都已经实现,因此同步系统和异步系统之间的差异可能并没有看起来的那么大。
总体来说,手机中使用异步系统是一种牺牲性能节省电量的折衷方法,并非是解决性能和功耗问题的唯一途径。很多时候高通MSM平台所宣称的节电效果是来自于CPU、Baseband、Modem等子系统的共同作用。异步就能省电是个巨大的认知错误。