百科问答小站 logo
百科问答小站 font logo



CPU的功耗和什么相关?为什么一个while(1);就可占满CPU的功耗? 第1页

  

user avatar   mikewolfwoo 网友的相关建议: 
      

谢邀。很久之前就被邀请回答这个问题,现在才抽出时间来。这个问题看起来有点傻,实际上也并不成立。一个while(1)最多可以让CPU某个逻辑内核占有率100%,而不会让所有内核占有率100%,更不会让CPU达到TDP。

在我就要回答,笑话他很傻很天真之前,忽然想到,那while(1)到底占了多少CPU功耗呢?这些功耗去哪里了呢?凡事就怕认真二字,如果仔细思考这个问题,就会发现和它相关的知识点很多。尤其在今天这个更加注重每瓦功耗的年代,知道原理,进而研究如何省电也就是应有之义了。

今天我们就来详细讨论一下CPU耗能的基本原理,它和什么相关等等问题。

CPU耗能的基本原理

我在这篇颇受欢迎的文章里面介绍过基本原理:

我们将CPU简单看作场效应晶体管FET的集合。这么多个FET随着每一次的翻转都在消耗者能量。一个FET的简单示意图如下:

当输入低电平时,CL被充电,我们假设a焦耳的电能被储存在电容中。而当输入变成高电平后,这些电能则被释放,a焦耳的能量被释放了出来。因为CL很小,这个a也十分的小,几乎可以忽略不计。但如果我们以1GHz频率翻转这个FET,则能量消耗就是a × 10^9,这就不能忽略了,再加上CPU中有几十亿个FET,消耗的能量变得相当可观。

从这里我们可以看出CPU的能耗和有多少个晶体管参与工作有关,似乎还和频率是正相关的。我们下面分别来看一下。

指令功耗

如果我们将CPU简单看作单核的,是不是运行while(1);就能让该CPU达到TDP呢?实际上并不会。每条指令所要调动的晶体管数目不同,而功耗是被调动晶体管功耗的总和。

《动物庄园》有一句话很经典:“所有动物生来平等 但有些动物比其他动物更平等”。是不是指令都是平等的呢?当然不是了,有些指令更平等!每条指令需要调动的晶体管数目有很大不同,一条新指令和已经在L1指令Cache中的指令也不同。一个简化版Haswell CPU的流水线示意图如下:

一个指令要不要调度运算器,要不要访问外存,要不要回写,在不在L1中都会带来不少的区别。综合下来,流水线中各个阶段的功耗饼图如下:

可以看到Fetch指令和decode占据了大头,而我们的执行才占据%9!!while(1);编译完的指令们,这时已经在L1中,Fetch会节省不少能耗。这也是达成同样功能,ASIC很省电,而CPU很费电的原因:

如果我们不讨论指令的差异,在平均意义上来看指令的功耗,它有个专有的名词:指令功耗(EPI,Energy per Instruction)。

EPI和CPU制程、设计息息相关。Intel的CPU在P4的EPI达到一个高峰,后来在注重每瓦功耗的情况下,逐年在下降:

耗能和频率的关系

从图1中,也许你可以直观的看出,能耗和频率是正相关的。这个理解很正确,实际上能耗和频率成线性相关。能耗关系公示是(参考资料2):

P代表能耗。C可以简单看作一个常数,它由制程和设计等因素决定;V代表电压;而f就是频率了。理想情况,提高一倍频率,则能耗提高一倍。看起来并不十分严重,不是吗?但实际情况却没有这么简单。

我们这里要引入门延迟(Gate Delay)的概念。简单来说,组成CPU的FET充放电需要一定时间,这个时间就是门延迟。只有在充放电完成后采样才能保证信号的完整性。而这个充放电时间和电压负相关,即电压高,则充放电时间就短。也和制程正相关,即制程越小,充放电时间就短。让我们去除制程的干扰因素,当我们不断提高频率f后,过了某个节点,太快的翻转会造成门延迟跟不上,从而影响数字信号的完整性,从而造成错误。这也是为什么超频到某个阶段会不稳定,随机出错的原因。那么怎么办呢?聪明的你也许想到了超频中常用的办法:加压。对了,可以通过提高电压来减小门延迟,让系统重新稳定下来。

让我们回头再来看看公式,你会发现电压和功耗可不是线性相关,而是平方的关系!再乘以f,情况就更加糟糕了。我们提高频率,同时不得不提高电压,造成P的大幅提高!我们回忆一下初中学过的y=x^3的函数图:

Y在经过前期缓慢的提高后在a点会开始陡峭的上升。这个a就是转折点,过了它,就划不来了。功耗和频率的关系也大抵如此,我们看两个实际的例子:

从ARM和X86阵营来看,他们能耗曲线是不是和幂函数图很像?

其他因素

一个while(1);最多让某个内核占有率100%,其他内核呢?CPU近期的目标是提供越来越精细的电源管理策略。原来不跑的部分就让它闲着,后来改成它降频运行,接着改成不提供时钟信号,这样犹嫌不足。现在CPU的电源管理由PMC负责,它会完全切断不用部分的电路。

在操作系统层面,它会尽力将不用的内核设置成CState,从而让PMC等电源控制模块有足够的提示(hint)来关闭电源。更多CState的知识见:

结论

拉拉杂杂的说了这许多,我们可以看出,while(1);并不会耗掉整个CPU的TDP。就算一个内核,它的耗能也不会达到该内核的能耗上线(现在都是Turbo Mode,内核能耗上限是个动态的结果)。它可以把该内核拉入Turbo Mode的最高频率,但因为指令都在L1中,耗能也不会很高。

至于消耗的能量都到哪里去了,根据能量守恒定律,一定是变成热量散发出去了。这个过程中也许会产生动能(风扇转动等等),光能/辐射(GPIO驱动LED发光),等等。但在最后的最后,都会变成热能。

其他CPU硬件文章:

更多CPU电源管理的文章:

欢迎大家关注我的专栏和用微信扫描下方二维码加入微信公众号"UEFIBlog",在那里有最新的文章。同时欢迎大家给本专栏和公众号投稿!


参考资料:

[1] comsol.com/blogs/havent

[2] CPU power dissipation

[3] How small can CPUs get?

[4] The Samsung Exynos 7420 Deep Dive - Inside A Modern 14nm SoC - Cheap PC hardware News & Rumors

[5] arxiv.org/pdf/quant-ph/




  

相关话题

  CPU 为什么那么多引脚?都是什么作用的? 
  如何评价 Intel 公布的 Rocket Lake S-Series 桌面处理器? 
  CPU缺失针脚能否运行? 
  为什么多方安全计算(或者隐私计算/联邦学习)在中国这么火? 
  到了 2022 年,人工智能有哪些真正可落地的应用? 
  为什么c/cpp语言的函数好像没有按照驼峰命名法呢? 
  专门用于 ANSYS 有限元的工作站电脑的硬件配置,该如何选择? 
  同为1250w电源,航嘉170块的矿电和正规近千块的用料差别在哪? 
  AMD3600想要升级,是等6000系列好还是买5000系列好? 
  CPU为什么那么多人要12代而不用11代? 

前一个讨论
如何从零写一个正则表达式引擎?
下一个讨论
如何利用 Twitter 开放者平台爬取 Twitter 数据?





© 2024-12-25 - tinynew.org. All Rights Reserved.
© 2024-12-25 - tinynew.org. 保留所有权利