当前位置: 华文星空 > 知识

Apple M1 Max功耗分析和探讨

2021-12-30知识

M1芯片的横空出世,改变了我们很多人对高性能低功耗CPU/SoC的认知。作为计算机系统结构方向的在读博士生,迫不及待想要踏上工作岗位的预备役架构师,我对这颗芯片的兴趣和圈内众多老师同学、前辈专家们是一样浓厚的。

所以MBP 21款发布的北美时间当天下午,我就下单订购了一台M1Max 32核GPU + 32GB内存的高配版。

在收到机器的11月15号之后,我花费了大量个人时间去搭建自动化测试环境,编译移植各种benchmark。终于在一个半月后的今天,能够将功耗测试结果呈现在这里。

其实我知道业界有几家顶尖SoC团队对M1系列芯片的逆向分析和Profiling工作都比我个人做的更早、更系统,但是圈内的前辈专家们受限于职位要求,相关数据和结论都是不方便公开的,希望这一份公开的功耗数据能带来更多的正面友善的公开讨论,为国产SoC/CPU行业做一点微小的贡献。

场景说明

我根据自己和几位朋友的日常使用习惯,总结了媒体、日常操作、生产力、游戏四个大类的21个场景,并在关闭所有后台app、断开电源电缆、全屏化操作的条件下启动测试脚本,记录功耗数据。

功耗测试脚本的核心是MacOSX自带的Powermetrics命令行工具[1],这个工具公开资料很少,推测其背后可能是苹果的功耗模型,与Intel RAPL类似[2]。使用Powermetrics本身也会带来微量功耗,Idle Power和Powermetrics本身带来的功耗已经从下述数据中扣除。

Package Power

M1Max在Media,Daily和Productivity三大核心场景下,功耗平均仅有2w,其中32GB LPDDR5 6400贡献了500mW,而CPU平均只有370mW。这再度印证了此前我接触到的业界手机SoC上的功耗分析结论: 内存功耗占比是不能忽视的一环,甚至很多时候高于CPU功耗

M1Max的GPU在内部工具里读出来的代号是Apple G13X,这颗GPU在三大核心场景下平均功耗仅为133mW,如果去掉抖音这个耗费1500mW GPU功耗的outlier,平均仅为55mW,哪怕是驱动120Hz高刷屏上的重度网页浏览时,功耗也只有78mW。作为对比,我的Geforce 1080Ti,理论浮点峰值和G13X相同,但在Win10完全Idle的状态下,GPU Core本身就有15w的功耗,板级功耗是23w。Apple G13X的能耗比优势可见一斑。

苹果的ANE(Apple Neural Engine)只在Facetime Video Call这一个场景中被唤醒,产生了689mW的功耗,其余场景功耗读出都基本为0。根据测试,微信视频也会唤醒ANE,但是其他场景都没有。看来AI加速器的落地应用对于苹果来说也是一个很头痛的问题。

来到游戏场景,CPU功耗:GPU功耗:内存功耗平均下来基本上是1:1:1的状态 ,也和高通此前公开的【堡垒之夜】测试结果[3]互相印证。有意思的是,游戏场景下GPU功耗有时还小于CPU,例如【NBA 2022】和【Asphalt 8】上都出现了这一现象。其中【Asphalt 8】从大核上消耗了5w功耗,甚至超过了很多CPU-intensive的benchmark,而GPU功耗只有800mW不到。

来到benchmark这一边,问题就有意思了。我拿来了整个SPECCPU2006,SPECCPU2017和ARM原生的Geekbencp加入对比,这三者基本都产生了2.5-3.5w的CPU功耗,以及0.5w - 2.5w不等的内存功耗(其中浮点类应用的内存功耗稍高)。从功耗的角度上来说,这些benchmark与日常核心场景、生产力场景、游戏场景的功耗分布情况都不太对得上,因此这些benchmark的功耗代表性,我个人会抱持怀疑态度。

CPU大小核分工与负载切分

在真实场景中,M1Max的大小核并不是一直活跃,而是只有10%-30%时间处于活跃状态,而且活跃状态下的平均工作频率也不高,大核平均1075MHz(重度网页浏览时会达到1.8GHz),小核平均1289MHz,这是mobile CPU功耗远低于Intel设计的一个重要原因。

作为对比,我之前使用Intel i9的MBP 2019,CPU频率如果低于2GHz就会产生明显卡顿,低于1GHz就基本没办法正常用,所以正常情况下Intel CPU频率很少低于2GHz,而M1Max在1.2GHz平均频率的小核上,系统基本感受不到卡顿。

通过把retired instruction的来源进行归类,可以反推出大小核分别承担的工作量比重。在这张图上可以再次看到benchmark和真实场景的巨大区别,真实场景上的小核要分担30%-70%的工作量,大小核的分工和切换是整个系统中不可缺失的一环,但是在这些流行benchmark中都没有覆盖到。

启示

在发布这篇文章前,我与一些工业界的前辈专家们讨论过文中的功耗数据,除了苹果低功耗设计的优异以外,大家都惊讶于苹果的Powermetrics能做到这种程度,上面有些部分的数据(例如大小核的负载切分情况),是用传统的拆机分析方法无法获取到的,因此,对于国内的同行们来说,发展一套类似的功耗模型是非常有必要的。

Powermetrics的功耗数据精度未知,具体原理应该是通过监测微架构级别的各种行为来合成一个功耗数值,从RAPL相关论文[4]中公布的情况来看,准确率推测是比较高的,或者说误差小于run-to-run variation范围。

(图为Intel RAPL功耗估计值与实测值的对比)

如何做到苹果这一级别的gating和DVFS也是一个可以研究的课题,里面有很多适合研究团队去探索的地方,比如Intel的论文里就提到一个现象,不同的场景下,CPU主频和实际性能并不一定成简单的线性关系,因为访存的存在,有时候拉高10%的主频只能获取8.6%的性能提高。从架构层面上来说,DVFS应该还存在类似的其他一些挖掘空间。

(图为Intel论文中展示的主频与性能的关系,会随着程序phase变化而变化)

游戏场景的测试数据出现了CPU功耗高于GPU,甚至高于CPU-intensive benchmark的现象,所以做mobile computing的同学可以考虑跟进分析,具体是什么样的代码导致了这样的行为特征。SPECCPU和geekbench这样的传统流行benchmark从功耗上来说无法表征真实场景,我们也需要一套更好的benchmark,能够更加真实地反映真实场景下的大小核负载切分和DVFS带来的性能/功耗变化。

此外,CPU与操作系统的低功耗设计垂直整合也是我们需要面对的新课题。例如说我观察到,同一个App从窗口模式下运行时,切换到全屏模式下运行后,M1Max的功耗会产生显著的降低,推测是点击全屏按钮以后,后台任务被挪到了小核上/进一步调低了电压频率/直接让后台任务睡眠导致的。

苹果的小核已经在500mW的功耗水平上干到了A76级别的性能,而小核会承担日常任务的30%-70%,是绝对不能忽视的部分,这对于海思和其他有志于自研核的团队来说又是一块不好啃的硬骨头了。

最后,我的12900KF也已经躺在新购置的Z690主板上,正在等待厂家的安装扣具到货。下一篇文章中我会加入12900KF的功耗数据,以及Intel最近十年的连续五代微架构的性能对比。

近期的另一项工作是编写调试MacOSX的内核模块,去抓取被苹果封印起来的M1Max性能计数器数据。如果这一项工作成功,M1Max的一些关键性能指标(例如8发射下的分支预测性能损失)也会一同呈现出来。

(本文首发于自己的个人公众号日常扯破布,知乎同步转载)

参考资料

[1] Powermetrics Man Page

https://www. unix.com/man-page/osx/1 /powermetrics/

[2] Intel RAPL

https:// 01.org/blogs/2014/runni ng-average-power-limit- –-rapl

[3] Mobile GPU approches to power efficiency

https://www. highperformancegraphics.org /wp-content/uploads/2019/hot3d/mobile_gpu_power_and_performance.pdf

[4] Power-Management Architecture of the Intel Microarchitecture Code-Named Sandy Bridge. IEEE Micro 2012.