迅维网

查看: 3809|回复: 24
打印 上一主题 下一主题

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

[复制链接]
跳转到指定楼层
1#
发表于 2017-11-17 15:33:59 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式 来自: LAN 来自 LAN

马上注册,获取阅读精华内容及下载权限

您需要 登录 才可以下载或查看,没有帐号?注册

x
假设CPU为单核,那么一个最简单的死循环就几乎能占满CPU的TDP了.那么CPU的功耗到底和什么有关呢?这里一个死循环难道要调用上亿个的晶体管满负荷运行?如果只要占用极少量的晶体管运行那为什么还能有那么大的功耗?

2#
发表于 2017-11-17 15:33:59 | 只看该作者 来自: LAN 来自 LAN
CPU 100% 不代表所有的元器件都在干活,只代表这个CPU别人不能用。

回复 支持 反对

使用道具 举报

3#
发表于 2017-11-17 15:33:59 | 只看该作者 来自: LAN 来自 LAN
CPU 100%说的是CPU time,不是功耗。
写一个简单的while(1)死循环就可以占满CPU time,是因为这是你给电脑的指示,你告诉电脑要尽可能多的执行这个程序。电脑就会把所有可以给它的时间都给它,导致没有Idle时间。
然而这个100%并不是真的100%,他只是拿走了所有可供使用的时间,操作系统没有傻到让一个死循环把CPU全部拿走。如果这时候你再写一个while(1)死循环,或者说开一个需要CPU的大程序,就会发现之前的死循环占用的不是100%了。
CPU time 100%不代表他占满了TDP。
不同的instruction带来的能量消耗是不同的。我猜测branch应该是一个消耗相对小的instruction,因为它不需要计算,不触发cache,只修改pc。因此我比较怀疑你认为你的死循环占满了TDP的观点,我认为他可能只是用了所有的CPU时间,而距离到达功耗的极限还有很大的距离。
满负荷运作的CPU,并不意味着使用到了所有的晶体管。
事实上,任何情况下,CPU上的晶体管都只有很小很小的一部分在「工作」。如果CPU上的晶体管同时「工作」,你电脑瞬间就炸了。所以无论是简单的while(1)死循环,还是复杂的大游戏,在某一时刻其实都只用到了一小部分晶体管,大部分晶体管是处于「闲置」状态的。
能耗其实是阻碍CPU高速工作的拦路虎。
随着器件越做越小,CPU上的能量密度是越来越高的,而在散热有限的情况下,如何降低能耗其实是CPU设计中很重要的一部分。让尽量少的晶体管同时工作,就是其中很重要的一个原则。

回复 支持 反对

使用道具 举报

4#
发表于 2017-11-17 15:33:59 | 只看该作者 来自: LAN 来自 LAN
CPU占用率不是功耗
100%表示CPU所有的时间都在用来执行你的程序,而不是CPU所有功耗都在用来执行你的程序
你说死循环程序可以占满TCP,怎么测算出来的?
我写了一个for(;;);的无限循环,开了8个实例运行,AIDA64测了一下功耗,34.22W
然后我随便开了8路并行build了一个boost,48W
提问者说区区一个无限循环就可以占满TDP,并不准确

回复 支持 反对

使用道具 举报

5#
发表于 2017-11-17 15:33:59 | 只看该作者 来自: LAN 来自 LAN
while(1);
并不是没有指令执行,翻译成汇编大概是:


loop:
       jnz loop

你看处理器一直在执行那个跳转指令

非要类比的话…类似于你躺在床上胡思乱想一宿,不能说你睡了一晚上吧?

顺便一说,现代处理器执行这个不会到达tdp上限,通常都是涉及到l1或者fp simd才会

回复 支持 反对

使用道具 举报

6#
发表于 2017-11-17 15:33:59 | 只看该作者 来自: LAN 来自 LAN
首先是占满CPU时间而不是CPU功耗。
占满CPU的“TDP”没什么意义,因为TDP本来就是热设计功率,和实际值差距会很大(一睿频就很可能超)。


我来给个猜想/解释吧。
CPU功耗分动态功耗/静态功耗。高cpu时间,频率自然也上去了,所以就是动态功耗占大头。
但是肯定不会达到理论最大功耗,原因是死循环的确没有用到那些复杂的计算单元。
可是看看cpu的结构图,缓存占了很大一片面积,而你cpu时间占用100%,cpu显然不会让缓存闲下来,所以缓存就成了耗电大头。——CPU还没智能到意识到你在故意死循环,从而关闭部分缓存休眠(这通常发生在部分核心关闭,或者低CPU时间占用的情况下)
CPU的缓存是SRAM,功耗和频率关系很大(参考Which-one-requires-more-power-consumption-SRAM-or-DRAM)。CPU时间上去了,自然会抬升CPU频率,缓存频率也会跟着上升,功耗也就不可避免地往上涨了。

回复 支持 反对

使用道具 举报

7#
发表于 2017-11-17 15:33:59 | 只看该作者 来自: LAN 来自 LAN
电脑没别的,就是实诚,你写个死循环,按电脑理解就是让它玩命执行,循环越多次越好.
这时候如果是英特尔的cpu,首先睿频调最高,撸起袖子加油干.
然后cpu内置current limit throttling激活了,这时候达到最高电流,也就是瞬间最高功率,此时瞬时功率大于TDP.
过几秒温度上升,另一个保护电路激活,也就是Thermal Throttling激活,cpu适当降频,功耗接近TDP,随时间与散热能力达到一个平衡值.
当然实际中执行一个死循环很多时候不会占用100%cpu时间,以上只是一种理想状况.
所以这几个概念其实不怎么挨着.

回复 支持 反对

使用道具 举报

8#
发表于 2017-11-17 15:33:59 | 只看该作者 来自: LAN 来自 LAN
CPU占满并不是代表CPU中所有的模块都在满负荷工作工作,比如IO模块、缓存模块。相同频率下,浮点运算单元的功耗要比整型运算单元高多了。此外级缓存也是CPU的一个非常耗电的模块

回复 支持 反对

使用道具 举报

9#
发表于 2017-11-17 15:33:59 | 只看该作者 来自: LAN 来自 LAN
NOP指令也是指令,别拿豆包不当干粮

回复 支持 反对

使用道具 举报

10#
发表于 2017-11-17 15:33:59 | 只看该作者 来自: LAN 来自 LAN
TDP是散热设计功耗,不是CPU的功耗,是用来指导设计散热系统的。


死循环看起来虽然简单,干的工作简单不代表就不需要能耗啊。此外,题目中所说应该CPU利用率高。

回复 支持 反对

使用道具 举报

11#
发表于 2017-11-17 15:33:59 | 只看该作者 来自: LAN 来自 LAN
小伙子,根据你提的问题来看,你怕不是应该先去了解一下什么是“分时操作系统”吧?
while(1) 只是强行占用了大量的时间片而已,占着茅坑不一定要拉屎啊!

回复 支持 反对

使用道具 举报

12#
发表于 2017-11-17 15:33:59 | 只看该作者 来自: LAN 来自 LAN
非低功耗操作系统,没程序执行的时候也会死循环执行nop只是把这些时间算空闲。

回复 支持 反对

使用道具 举报

13#
发表于 2017-11-17 15:33:59 | 只看该作者 来自: LAN 来自 LAN
请注意CPU满占用和CPU满功耗是两回事。

拿你举的例子来说,CPU的功耗远没有到达顶峰。因为while(1)没有算数逻辑运算,没有缓存访问,所以ALU和LSU都闲着没干活,功耗肯定不会用满。

以下伪汇编还差不多(还得把编译器的优化关掉)
; x86不熟,用ARM的凑合吧,注意其实ARM的也不熟,所以下面只能是伪代码
; 想更爽一点的话可以加FP指令,不过这个我就更不熟了
START:
LDR R0, [R1]     ; 假设R1是cacheable并有读写权限
ADD R0, R0, 1
STR R0, [R1]
B START

回复 支持 反对

使用道具 举报

14#
发表于 2017-11-17 15:33:59 | 只看该作者 来自: LAN 来自 LAN
回想一下你思考这个无意义(物理上)的问题大脑耗了多少能量,你就理解CPU为什么功耗能那么高了。()

回复 支持 反对

使用道具 举报

15#
发表于 2017-11-17 15:33:59 | 只看该作者 来自: LAN 来自 LAN
一般意义的功耗=电压*电流,即电压越高越耗电。
电流又和三晶体管开关有关,每次晶体管状态切换都要耗电,不切换则基本不耗电,具体来说就是当cpu执行某种运算时,会开始耗电,运算频率越高,越耗电。


while(1)底层是在不断执行跳转指令,因此cpu不断地在执行指令,全力耗电,虽然说是无用功。

回复 支持 反对

使用道具 举报

16#
发表于 2017-11-17 15:33:59 | 只看该作者 来自: LAN 来自 LAN
只是分配机制的问题
空死循环纯属占着茅坑不拉屎

回复 支持 反对

使用道具 举报

17#
发表于 2017-11-17 15:33:59 | 只看该作者 来自: LAN 来自 LAN
我要是编译器,遇到这种代码,直接优化省略掉(跑个题)

回复 支持 反对

使用道具 举报

18#
发表于 2017-11-17 15:33:59 | 只看该作者 来自: LAN 来自 LAN
(瞎猜)超标量处理器死循环,会把核内所有流水线和分支预测乱序执行电路都跑起来,一时钟周期把这个循环跑三四遍…这已经动员了处理器核内大部分晶体管了……

回复 支持 反对

使用道具 举报

19#
发表于 2017-11-17 15:33:59 | 只看该作者 来自: LAN 来自 LAN
我不是微电子学出身的,不过关于这个 问题我有过一些思考,不一定准确,写出来供参考。
CPU在工作的时候产生功耗的电子学基础是什么?这个问题是在我搭了第一个分立元件cmos H桥电路并用它来驱动步进电机的时候想明白的。
以下是cmos H桥的原理图:
可以看到左右两边是一对对称的如下的结构:
这个结构在cmos逻辑电路中被大量应用,本质上是一个cmos非门。CPU里面理论上是大量存在的。在工作的时候,理想情况下,两个场效应管(FET)的导通或者截止收到In上的输入电压控制,上面那个FET和下面那个 FET会交替导通,所以out的电位就会随in的输入信号而变。
如果你搭一个H桥电路,并用它来驱动一些负载的时候会发现in端给的控制信号频率越高,H桥的管子就越热。原因是,当In端的输入信号发生翻转的时候,有那么一个瞬间,上面哪个mos fet和下面哪个mos fet都处于半导通状态,从而产生了从vdd到gnd的直通电流,由于电路的带宽是有限的,所以每次翻转的导通时间有一个下限。所以翻转频率越高,单位时间内发生同时导通的时间比例也就越高,从而有越多的能量变成焦耳热耗散调。
具体到CPU里面,某个部件的工作频率越高,那么它的热功耗越大。而CPU本身是有不同等级的闲置模式的,处于闲置模式的时候某些部分是关闭的,要么降频,要么直接关掉,都能不同程度地减少功耗和发热。


while(1)的时候,一方面更多的部件被开启,另一方面CPU的工作频率被提高,两个因素都提高了功耗,增加了发热功率。

回复 支持 反对

使用道具 举报

20#
发表于 2017-11-17 15:33:59 | 只看该作者 来自: LAN 来自 LAN
和频率成正比,和电压的平方成正比。但跑不一样的指令集功耗也不一样,就像一个人,你让他拼了老命去跑步,和拼了老命去考试,占用率都是100%,但功耗肯定不一样
而且TDP只是热设计功耗,超个频加个压功耗就很容易超过TDP值

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表
附近
店铺
微信扫码查看附近店铺
维修
报价
扫码查看手机版报价
信号元
件查询
点位图 AI维修
助手



芯片搜索

快速回复