• 刨根问底:为什么玩游戏会让手机变得更热?


    看到这个问题的第一瞬间,我想你可能会多多少少有点诧异。诧异的倒不是这个问题原来并不那么简单,甚至还有点复杂呢;而是诧异有人竟然问这么弱智的问题。地球人都知道,玩一会游戏手机就会发烫,这还用问为什么吗?就像苹果熟了就是要落地的。当然这个问题还不至于扣上这么大的帽子,不过还是值得我们好好思考一下的。

    接着上面的问题,如果你再追问一下,了解一点原理的人可能就会告诉你,游戏是比较吃或者说消耗CPU的,所以CPU会变热,这导致手机发烫。大部分人对这个问题可能就思考到这一步。

    如果我们再追问,为啥玩游戏CPU会更热?仅仅就是我们感觉的游戏会比较消耗CPU资源吗?那怎么样才算是消耗CPU资源?你可能会说,游戏会让CPU更加忙碌或者说不得闲。那这时候就要灵魂拷问,难道微信聊天的时候CPU不忙吗?如何定义这里的忙或者是更忙?显然,我们应该给一个闲的对比。CPU什么时候闲呢?

    这就逐步涉及到专业内部领域了。学过操作系统的人可能会说,CPU没有任务的时候,就闲下来了。因为玩游戏要一直跑,所以CPU不得闲。而微信聊天,虽然宏观上CPU也是忙碌的,但是到微观层面,就没有处理游戏功能那么繁忙了,甚至更深入一点,因为聊天存在等待的过程,所以从微观层面上看,CPU可能大部分时间处在等待IO,而并没有处于持续运算状态。

    当然,回答到这一点,就需要一些专业知识的辅助了。慢慢的,我们就会发现,这个问题,相对而言,可能并不那么简单呢。让我们继续来探讨。

    我们还是回到忙的对立面闲上面来。的确,我们系统中运行的任务是有差别的。对于游戏、音视频处理这类任务,通常都会认为是计算消耗型的,就是完成这些任务,需要CPU处理大量的运算。有些任务,则被认为是IO消耗型的,比如鼠标键盘、聊天软件等,这类任务需要的是及时响应,其本身需要运算处理的信息量并不大,时间也不长,因为现代的CPU速度很快。很多时候CPU都是等待IO的状态。早期,linux的任务调度设计,还考虑了任务的这类特性而做了针对性的设计呢。

    我们姑且可以将上面的CPU等待IO的状态认为是CPU得闲的时候。这个时候CPU在干嘛呢?是在睡眠吗?显然不是。此时,睡眠的是任务,而不是CPU。继续深挖操作系统实现,比如就linux而言,你可能知道这时候CPU会调度执行idle任务。我们就从这个切入点来看。Idle本身就是空闲的意思,说明这个时候CPU闲下来了,没事可做,就到idle任务上待着吧。等到有任务到来了,就继续去干活。所以,运行idle,就被认为是CPU在休息了。

    那么,我们看看,idle中CPU处于什么状态?从linux的实现来看,idle本质上是一个死循环,CPU执行idle,就是说CPU无限循环在idle中。等等。什么?CPU在idle中死循环?如果有编程经验和经历,很多人都会有切实感受,应用程序里的死循环反而会让CPU更忙碌。如此来看,所谓的idle,名不符实啊。如果CPU在这里死循环,那应该更忙了,发热更严重了才对。为啥实际不是这样呢?

    好了,我们慢慢接近这个问题的本质了。这个时候,你如果再诧异,那就只能诧异开头所述的第一点上了,否则就说不过去了。

    再继续讨论之前,我们先简单总结一下:从最底层的CPU来讲,无论跑在哪个任务上,其自身都没有闲下来。也就是说,我们并没有告诉CPU,你休息一会吧,一会再起来忙。无论是不是在idle任务中。

    现在我们就继续分析,为啥运行idle任务的时候,CPU的发热会比较小,而运行游戏或者音视频任务的时候,CPU发热会比较大。

    其实,这个时候,就触及物理学中的基本概念了。热是什么?搜索相关的定义,可以看到,热是与温度相关的一个概念,CPU发热,更准确的说,是释放了热量,也就是转移了能量。因为CPU比周围空气包括我们的皮肤温度更高,所以你会感觉到热。那么,热的本质是什么?虽然博主在这里无法给你一个精确的描述,但是,以大家都能交流的中学物理来讲,就是分子运动。参与的分子越多,运动越激烈,释放的热量就越多。因为CPU处于一个电磁系统中,所以,我们更常见的是以电功率来描述,也就是电流做功来衡量。下面以一个极简单的例子来说明,如下图的中学物理中经典的电灯泡实验:

    我们可以从不同层面来做一下对比:

    先从宏观层面来看。CPU就可以看做图中的电灯泡。这本质上就是一个等效电阻模型,只不过这个CPU的等效电阻并不固定。从功率的计算公式来看,P = UI = I2R = U2/R,可以看到,电功率与电压、电流和电阻都有关系。一般,我们认为上述电路中电压是固定的,所以电阻越小,电流越大,相应的功率应该也增大。因此,在CPU空闲的时候,等效电阻就是增大的情况,而忙的时候,等效电阻是降低的情况。

    电流的大小反映了电子的数量,电流的通路反映了电子的运动。大量电子的运动,对电阻做功,产生了发热现象。所以,CPU发热大的时候,流经CPU的电流就应该是更大,进一步的,就是CPU内部参与运动的电子数量更多。

    单单通过上面宏观的描述,并没有解答我们的疑问。除非能够解释清楚为啥CPU空闲的时候,等效电阻是增大的,电子是减少的。所以,为了更好的说明问题,我们还是继续从微观上来分析。

    大家都知道,CPU内部是由大量的晶体管构成的。这些基本的晶体管就是我们常听到的二极管、三极管。通过二极管和三极管的组合,就能够组合出复杂的电路来。二极管实现电路的单向导通,三极管实现电路的放大作用,这些就类似线性代数中的线性无关概念,是底层的基本构成元素。

    构成CPU的晶体管就如同构建CPU功能大厦的静态结构,要让CPU工作起来,还需要一个外部时钟。时钟流过这些基础器件,就能产生我们所需的各种复杂功能。这个时钟就是时序电路的驱动源,或者说是动力源。其实,时钟不仅是驱动源,更是整个系统工作的基准。还是以上面的灯泡实验为例。如果只是像上图的灯泡点亮,虽然也处于工作的动态状态,但是并不能表达复杂的逻辑。但是如果上面的灯泡变成了闪烁,那么就可以表达比较复杂的信息了。举个不恰当的例子,我们可以通过闪烁的不同变化来表示不同的含义;还可以通过闪烁的变化,表示信息的传输。闪烁的越快,就表示传输的越快。

    其实,CPU内部的二极管、三极管也可以类比成电灯泡。只不过这些二极管、三极管并不是像灯泡一样处于常亮的工作状态,而是处于闪烁的工作状态,这是由周期变化的时钟来驱动的。但是,我们可以简单的算出,如果一个二极管在一个工作周期中产生一次通断,那么它有一半的时间是处于连通的状态,电流就会做功。对比与电灯泡,就好比灯泡一半时间亮着,一半时间灭着。

    现在,我们就可以来分析前面提到的CPU忙闲和发热的关系了。

    前面已提及,CPU内部有大量的晶体管,最近的苹果A16处理器宣城集成了接近160亿个晶体管。如下图所示:(图片来自苹果官网www.apple.com)

    CPU内部虽然有这么多晶体管,但是并不是所有的晶体管都处于工作状态,这要根据CPU的架构设计和工作状态来看。现代CPU内部的设计相当复杂,如下图所示ARM的一款CPU内核框图:(https://en.wikichip.org/wiki/arm_holdings/microarchitectures/cortex-a77)

    从上图可以看到,CPU内部有很多功能单元。注意,图中只是CPU的ARM核心。现在手机上的CPU,跟桌面CPU不同的一点在于,这种平台上的CPU一般都称作SOC,也就是片上系统。物理CPU内部除了传统CPU功能单元外,还集成了很多其他功能单元,比如GPU、神经网络单元、音视频编解码模块,另外还集成了各种的接口,比如串口、网口、图形图像显示接口、各种串行、并行外设接口等。这样一种设计方案,大大简化了外围电路,可以最大程度的减小电路板大小,使得产品的手持化变得可行。如下图所示瑞星微一款CPU的功能框图:

    基于上面这些讨论,我们再来看CPU的忙和闲。首先,对于物理CPU,严格来讲是SOC,这种忙和闲,体现在不同功能单元和接口之间。比如,如果当前没有其他事务处理,那么idle状态的SOC,物理CPU内部很多其他部件可能处于非工作状态,自然,整体的做功就比较小。更进一步,如果通过软件设计能够断开或者关闭部门功能单元的时钟,那么这些单元就处于阻断状态,类似电灯泡的灭状态,这样发热源就会少很多。虽然CPU仍然在运转中,但是跟调动其他模块进行图形、网络等功能处理相比,工作部件大大减少,自然发热就少很多。所以,此时的忙和闲,指代了整个SOC的忙和闲。

    其次,对于SOC内部的CPU核心来讲,(其实对其他模块来讲,原理也是一样的),idle状态的CPU核心,虽然也在不停的执行指令,但是这类指令很简单(比如Nop这类空操作指令),只是占用了一个指令周期而已。CPU内部的一小部分逻辑电路就能处理这类指令,不涉及的电路部分同样可以不用工作。比如,其他很多外部取值、译码、运算、访存等功能单元,都可能不用执行或者不用全部执行。显然,这也是一种忙和闲的差异状态,只不过这种差异状态主要涉及CPU核心内部的功能单元之间。

    现在,我们回过头来看,所谓的CPU忙和闲,并不是说CPU是工作还是睡眠,而是即使是工作中的CPU,也会因为处理的任务的不同,存在轻松和累的区别。反映到做功上,就是发热了。

    就跟我们一个人一样,同样是清醒的一天,躺在床上发呆一小时跟考试一小时,消耗的能量是不一样的。我们可以将发呆看做idle,而将考试看做busy。

    到此,我们基本就完成了对标题中问题的解答。

    搞清楚了上面的内容,当我们要节省设备功耗时,就能充分思考,做自己的设计了。

    其实,对手机来讲,发热是一个复杂的问题。在电池技术无法取得突破的情况下,如何优化设计,降低功耗,就成了一门艺术。从数学的本质上来讲,我们进行优化,就是要找到每一个最佳路径,或者线性无关的组合。比如,对于CPU指令来讲,如何设计,使得使用最少的周期完成最复杂的功能,这就是一个类似最优路径的问题。好的设计,可以不断逼近这个路径,从而降低产品的功耗,这就是同样是硬件CPU,不同厂家设计的功耗表现不同,甚至是差异巨大。软件层面也是这样的道理。

    对于开头的问题,我们只是重点讨论了CPU。可以想象到,CPU访问内存和访问内部cache,电子走的路径长短不一样,做的功也不一样。屏幕显示相对固定的画面跟不断变化的画面,从能量守恒的角度来看,消耗的资源也是不一样的。进一步扩展开来,同样表达一个状态,比如开和关,用一个电灯泡和一个二极管,耗电是不一样的;驱动少量电子和大量电子,耗电是不一样的。这就是为啥要不断改进CPU的工艺,使用更低的电压,更小的制程来完成更加复杂的功能,而且耗电还更少。最终其实是提升了单位面积的能效。回归到电灯泡,节能灯为啥可以更省电而且更亮,从哲学的角度来看,跟CPU的这个道理是一样的。

    上面,我们主要通过宏观、微观以及开关状态分析了CPU的发热原因。其实CPU内部的发热来源是比较复杂的,远远超出上述分析所覆盖的范围。举个简单例子,为啥频率越高越耗电。频率越高,说明时钟变化周期越短,切换越频繁。如果以开关状态来分析,可能等效的通断时间并没有变化。但是,实际上每一次切换都可能产生耗电,这包括器件的漏电。相反,电压的保持状态可能因为阻断,反而是不那么耗电的。抛开理想状态,整个电路还有漏电功耗和短路功耗。耗电产生发热,发热又会影响器件特性,进一步增加漏电功耗等。所以,说功耗的控制是一门复杂的艺术绝对不为过。感兴趣的读者可以查找专业的资料学习。

    最后,我们发散一下思维,考虑这样一个问题:摩尔定律逼近极限,一方面是制程和器件原因,另外一方面是高频导致的发热不能很好解决。假设,如果这两个问题能够解决,那么,你手机中的CPU,其极限频率可以达到多少?

  • 相关阅读:
    2020-ViT ICLR
    Vuex简介
    【AI案例】(一)NPL文本情感分析
    大数据_数据中台_数据汇聚联通
    LAL v0.35.4发布,OBS支持RTMP H265推流,我跟了
    MySQL 8.0 新特性之不可见主键
    数据结构与算法——线性查找法
    C/C++内存管理
    Excel必备!6种快速插入√或x标记的方法揭秘
    [激光原理与应用-25]:《激光原理与技术》-11- 控制技术-非线性技术之激光倍频、非线性晶体CLBO、BBO、LBO
  • 原文地址:https://blog.csdn.net/wwwyue1985/article/details/126924905