百科问答小站 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/




  

相关话题

  12306 一崩再崩,作为程序员你最想优化哪个功能? 
  你是怎样申请到 PhD 的呢? 
  英伟达宣布将以 400 亿美元收购 ARM ,如何评价这一收购?这意味着什么? 
  在计算机科学领域,为何不使用拼音代替英文做为关键字? 
  高中就已经写过 10w 行代码的人都是什么人? 
  现在手机 SoC 性能大概相当于哪个时代的 PC? 
  高通SDM660AIE与联发科P60的差别? 
  你在生活中用过最高级的算法知识是什么? 
  计算机科学领域有哪些「民科」和「反智现象」? 
  电子(EE)专业犹豫要不要研究生转计算机专业(CS)? 

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





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