为什么手机核心数目提升的比计算机快?
吴章金falcon,开源践行者 / Linux贡献者 / 泰晓科技 创始人
需要澄清地是,如果问题的计算机不单指 PC,问题本身都是不成立的。因为几年前笔者开发 BSP 时,就有做过多达 16×4,即 64 核的网络交换机方案,而用于超算的大型计算机的核心数目更会惊人。
另外,如果算上 GPU,这个问题也可能不成立。
好吧,这里暂且设定背景为手机与 PC 的 CPU 吧。
—
两个领域有非常不同的需求~
PC 可以一味地追求高主频,高单核性能,因为它可以安装风扇或者安装很大块的散热装置,可以直接接入家用能源。当然,虽然 PC 的性能往上涨的空间可以更高,但是这个“一味地”也是有限制的,所以 PC 在更早以前就在尝试多核了。
但是手持智能设备的单核不可以“一味地”追求高频,它小巧,它随身携带,它要考虑发热,要考虑电池的容量。所以,智能终端的 SOC 在设计的时候必须在兼顾温控与能耗的情况下。这注定智能终端的 SOC 要走 PC 的多核化老路,并且做更多样化的尝试。
就是因为这种差异,导致手持设备 SOC 的设计厂商在做各种架构,技术与工艺的尝试。
多核只是其中一种尝试。
因为单核在主频上去以后,要求的电压更高,发热严重,而随着发热量的增加,漏电率又会增加,会进一步增加能耗与发热。而这两项恰会影响手持设备的两个重要体验,即续航与温控。
在单核方面,相应的技术改进有 HPM 以及最新的 FinFet,漏电率比 LP 下降不少,所以同样的主频可以跑在更低的电压上。除此之外,还有一些筛选和区分不同品质晶圆的技术,例如三星的 ASV,晶圆质量高的同频下可以跑更低的电压。
与此同时,还有各种类型资源的 DVFS 支持,idle 支持,clock gating,regulator gating,power domain……
好了,那单核的性能努力如何呢?从当前市场上在售的来看:
“ Cortex-A57 是 ARM 最先进、性能最高的应用处理器,号称可在同样的功耗水平下达到当今顶级智能手机性能的三倍;而 Cortex-A53 是世界上能效最高、面积最小的 64 位处理器,同等性能下能效是当今高端智能手机的三倍。这两款处理器还可整合为 ARM big.LITTLE(大小核心伴侣)处理器架构,根据运算需求在两者间进行切换,以结合高性能与高功耗效率的特点,两个处理器是独立运作的。”
而未来联发科上市的全新 Helio X20(即 MT6797)的大核 A72 可以到 2.5G。
那问题来了,虽然性能很强劲,但是发热的剧增会导致处理器持续高频不了多久。因为人体的温度是恒定的,37 度,如果人体接触的物体温度,温一点,42~43 度,再热一点 45~47 度,再就烫起来了。所以这个加上主板的散热结构已经阻止了固定工艺和技术下的性能成长空间。也限制了高频核心的高性能的应用。
而加上手持设备的结构空间限制,又限制了散热技术的应用,这个是 PC 和服务器根本就不存在的问题。
既然往上涨不了了(实际上还有技术和成本制约),那是不是可以横着涨呢?好了,尝试多核,而多核又有同构多核,异构多核,有真多核还有伪多核。
到这个份上,咱们就可以得到一个初步的结论,多核完全是为了迎合消费者,不是为了迎合和迎合,而是为了给用户更好的体验。
为什么会提供更好的体验?
随着主频的提升,单核的工作能耗会随着指数级上升,相应的热量聚集也会更高。换算到同等计算能力(单位时间内可执行的指令数)的多核,能耗上升呈线性关系,热量聚集会明显降低。具体量化起来,得画个图表,把频率,核数和能耗关系绘制出来,这里先省掉。大家可以看下百科上的一篇推导:多核_互动百科
先来介绍一下这种换算的实际场景限制:
1,对于远古时代的单一任务系统,多核是没有意义的。任务的工作量没有办法分派给其他核心执行。并行不起来。
2,现今的系统,包括 Android 等手持设备的系统默认任务数量已经非常多,具体数量会有差异。稍微看了下 MX3,有 100 ,实际线程数只会更多。
3,多核相比单核,无用的任务 Context Switch 会减少,能耗利用率会提高,任务的响应能力(最高频率满足条件下)也相应会增加。甚至对于一些关键的任务,可以通过独占某一个核心获得最好的响应能力。
那核数是不是越多越好呢?是不是 100 个任务就开 100 个核呢?肯定不是,首先有硬件成本(晶体管个数会成倍增加)的限制;其次,核数多了以后,负载均衡,任务迁移,甚至任务同步也是很大一笔开销;再者,并不是所有的任务都是大任务(CPU 紧密型,典型的例子是 Android 升级包的 AES 解密算法),实际上是大部分任务都是轻任务(典型的例子是很多内核线程,比如 watchdog),轻任务完全可以通过单核分时调度,未来的 Linux 还支持 package 多个小任务到一块;还有一个是,蛮多应用在开发之初未能采用多任务设计,无法充分利用多核。
那到底应该设计成多少个核呢?不同的核如何分配呢?大小核还是异构多核?
核心数的上限应该取决于实际的应用情况:
1、单个应用的设计情况,暂时手头没有详细的不同应用的线程数数据,综合其他渠道的一些数据,大型游戏通常会是使用多任务的典型场景。
2、多个应用同时工作的情况,以及前后台同时工作,系统启动,系统休眠后唤醒等场景,例如后台下载,听音乐,前台浏览网页。
3、未来应用场景,比如说分屏与多窗口,多个前台应用同时工作等。
具体的核心数利用情况,手头没有大数据,暂时不给确切的结论。后面找个时间写个脚本观察下自己一天的使用情况,把日常应用都跑一遍,统计下真实的核心利用率,根据部分实验结果预计部分场景可以到 5~8 个,也有部分可以比较充分地利用 3~4 个,而有一部分用到 1~2 就够了。
但是目前最多的手机核数已经到 8 核,包括同构与大小核(big.LITTLE)。
同构多核的 8 个核是对等的,所以考虑的场景更多应该是 8 个核同时利用的情况,这个情况应该是非常少数的,比如系统启动,前后台多个大型任务同时工作,以及未来潜在的分屏或者多窗口,再一个是 Benchmark(忽悠!)。
而大小核(4 4)的这种情况则不一样,这相当于搞了两个档位,一个高档位是 High Performance 的 U,一个低档位是 High Efficiency 的 U,这个可以针对不同应用场景进行灵活组合,并不需要多个核一定要完全跑起来,比如说:1)很多小型游戏,比如说玩过的一个漂流游戏,三个小核跑起来很节能也很顺畅,但是 2 个就不够,第三个线程无法并行。2)比如说应用启动与 ListView,可以立即迁移到大核上,保留 1~2 个小核跑其他的小任务,Boost 1~2 秒后,交互完工后再回到小核。3)而开机以及前后台等场景则可以突发把所有核心都开起来,做到快速开机。这里的大小核同样是切了答主在开头提到的手持设备的续航和温控体验的,这里的多核并不仅仅是需要多个核心同时跑起来,而是可以有多个不同的档位选择适应不同的场景。
至于 MTK 未来的 4 4 2 架构(Helio X20)则更多是对当前大小核的一个补充,相当于多引入了一个档位,这个对于平衡能耗与性能是非常不错的尝试。相比于之前简单的调频来调节档位,这个切换不同架构的 U (low energy v.s. high performance)的档位能更好地体现能效与性能的差异(蛮像汽车的档位哈),谋求不同场景的应用需求。
A72 的引入必然会全面提升交互场景以及超大型游戏的应用体验,让交互延迟进一步下降。而两个低档位的不同频率(工艺方面暂时不确定是否有差异?)的 A53 则可以进一步突破 MT6752 的同构 8 核架构,让两对 4 核分别满足不同场景需求,比如说在线浏览和小型游戏等日常应用场景可以降到最低档,而中型游戏可以跑中档,确实负载小的时候还可以切回最低档;而系统启动等场景,由于可以多核全开,那么启动速度可以预想应该会提升不少。
A53 的能效设计优势已经被证明,而 A72 作为 ARM 的下一代 High Performance CPU,性能提升是可以预见的。我们可以预想 Helio 这款 U 的能效与性能应该可以做到更好的 Balance,期待有更精彩的表现,对于续航、温控与交互体验或许都会有提升。大家可以看看某媒体的实测情况:测试曝光:Helio X20 运行温度低于骁龙 810_科技频道,具体还是要看后续市场产品的表现了。
不过对于低端一些的机型,如果多核的价值不能得到充分发挥,出于成本的原因,或许会回归 5 ~ 6 个核心,比如 3 2 或者 4 1 或者 2 2,如果 1~2 个 big 核采用 A72,那么综合的性能和能效表现或许会更好。