CPU的功耗和什麼相關?為什麼一個while(1);就可佔滿CPU的功耗?

假設CPU為單核,那麼一個最簡單的死循環就幾乎能佔滿CPU的TDP了.

那麼CPU的功耗到底和什麼有關呢?這裡一個死循環難道要調用上億個的晶體管滿負荷運行?如果只要佔用極少量的晶體管運行那為什麼還能有那麼大的功耗?


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設計中很重要的一部分。讓盡量少的晶體管同時工作,就是其中很重要的一個原則。


CPU 100% 不代表所有的元器件都在幹活,只代表這個CPU別人不能用。


CPU佔用率不是功耗

100%表示CPU所有的時間都在用來執行你的程序,而不是CPU所有功耗都在用來執行你的程序

你說死循環程序可以佔滿TCP,怎麼測算出來的?

我寫了一個for(;;);的無限循環,開了8個實例運行,AIDA64測了一下功耗,34.22W

然後我隨便開了8路並行build了一個boost,48W

提問者說區區一個無限循環就可以佔滿TDP,並不準確


while(1);

並不是沒有指令執行,翻譯成彙編大概是:

loop:

jnz loop

你看處理器一直在執行那個跳轉指令

非要類比的話…類似於你躺在床上胡思亂想一宿,不能說你睡了一晚上吧?

順便一說,現代處理器執行這個不會到達tdp上限,通常都是涉及到l1或者fp simd才會


首先是佔滿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頻率,緩存頻率也會跟著上升,功耗也就不可避免地往上漲了。


是時候拿出這張圖了:

Haswell核心架構圖

While(1)的時候,基本是圖上紅框裡面的單元在全速工作,其它的或者完全休眠,或者只有部分參與,或者低速工作。你覺得實現紅框裡面的這些單元使用的晶體管有多少?

當然,這是現代的CPU,具備完善的功耗控制單元。老式的CPU中,其它部分就算不工作,也是在高速運行的。不說while(1)了,閑置不動也一樣在消耗功率。


電腦沒別的,就是實誠,你寫個死循環,按電腦理解就是讓它玩命執行,循環越多次越好.

這時候如果是英特爾的cpu,首先睿頻調最高,擼起袖子加油干.

然後cpu內置current limit throttling激活了,這時候達到最高電流,也就是瞬間最高功率,此時瞬時功率大於TDP.

過幾秒溫度上升,另一個保護電路激活,也就是Thermal Throttling激活,cpu適當降頻,功耗接近TDP,隨時間與散熱能力達到一個平衡值.

當然實際中執行一個死循環很多時候不會佔用100%cpu時間,以上只是一種理想狀況.

所以這幾個概念其實不怎麼挨著.


CPU佔滿並不是代表CPU中所有的模塊都在滿負荷工作工作,比如IO模塊、緩存模塊。相同頻率下,浮點運算單元的功耗要比整型運算單元高多了。此外級緩存也是CPU的一個非常耗電的模塊


NOP指令也是指令,別拿豆包不當乾糧


回想一下你思考這個無意義(物理上)的問題大腦耗了多少能量,你就理解CPU為什麼功耗能那麼高了。(???)


小夥子,根據你提的問題來看,你怕不是應該先去了解一下什麼是「分時操作系統」吧?

while(1) 只是強行佔用了大量的時間片而已,占著茅坑不一定要拉屎啊!


TDP是散熱設計功耗,不是CPU的功耗,是用來指導設計散熱系統的。

死循環看起來雖然簡單,乾的工作簡單不代表就不需要能耗啊。此外,題目中所說應該CPU利用率高。


在幾十年前Dennard Scaling還有效的時候,晶體管功耗隨工藝發展成比例下降,單位面積晶體管功耗不變。也就是說用了更好的工藝以後,雖然單位面積晶體管成倍增加,但功耗保持不變。這時候絕大部分的晶體管都可以同時工作。Dennard Scaling失效以後,工藝改進,單位面積功耗會不斷上升,為了維持總功耗不變,只有一部分晶體管能同時工作,這是Dark Silicon。

晶元的功耗主要分為兩類,靜態功耗和動態功耗。

靜態功耗又叫做漏電(leakage),晶體管本身也是導體,只要有輸入電壓就會一直有微弱電流通過,不管有沒有在工作。而要消除靜態功耗,需要完全斷電(power gating)。降低電壓會降低漏電流也會改善靜態功耗。

動態功耗來自於狀態改變(1-&>0或者0-&>1)時電容充電和放電過程消耗的電能。由於晶元都是時鐘驅動的,而時鐘會一直在變,鎖存器一類的電路在時鐘變化的時候也會發生狀態變化,即使輸入輸出不變,只要有時鐘在驅動,它會一直產生動態功耗,哪怕它什麼都沒做。動態功耗正比於電壓平方、頻率和電路的電容。由此可見,我們有兩種方式可以降低動態功耗,當電路不在實際做事情的時候,關閉時鐘驅動(clock gating),另一種方式則是降低電壓和頻率(電路的電容是電路特性沒法改變)- DVFS(Dynamic Voltage Frequency Scaling)。

Clock gating或者DVFS不會影響電路中保存的信息。Clock gating可以做到模塊間完全獨立開關,所以對性能的影響很小。頻率從高頻到低頻和從低頻到高頻通常會有一定的延遲,因為需要整個晶元協同,有些時候也需要軟體介入。

而power gating代價比較大,比如,SRAM會因為斷電損失數據,所以power gating需要保存片上數據,甚至於需要軟體全面介入,對性能影響比較大,從gating狀態喚醒的延遲也很大。通常會把晶元劃分為多個power domain,每個power domain可以獨立控制。當然,獨立的power domain在設計上開銷也很大。

現在來回答這個問題,當CPU在執行死循環時,功耗高很可能是:1)功耗控制模塊無法將處理器核心進行clock gating,這時候核心會耗電,即使死循環不會用到所有功能單元,但由於所有功能單元都處於被時鐘驅動的狀態,實際上仍然在耗電,並且耗電很大;2)因為死循環中間不會被中斷,CPU佔用率很高的狀態下,功耗控制單元會誤認為現在CPU需要運行在高性能狀態,沒有操作系統干預的情況下,電壓和頻率都會處於比較高的狀態,這時候無論動態功耗,還是靜態功耗,都會很高。


不能佔滿CPU資源,去看看單片機就知道了,while(1)很正常,因為還有中斷,可以跳出。

現代CPU和操作系統更加複雜,正常情況下,是無法佔滿CPU的所有資源,功耗和電流有關,但是具體電流多少情況就比較複雜。


你看了一天的電影,但你的各個器官也沒有全負荷工作噢


我看了題主的問題,及一些人的回答,一度開始懷疑自己學的進程是不是一個虛假的概念


你寫個程序啥也不幹就一個死循環 什麼也不用等 自然CPU要高速運轉來滿足你的程序了

功耗當然會高點 一般正常程序至少都要讀下內存什麼的吧 等待的途中CPU會自動降低頻率

你這倒好 一直乾沒用的事情 至於佔不佔得滿TDP 還要看你用的什麼CPU對吧


非低功耗操作系統,沒程序執行的時候也會死循環執行nop只是把這些時間算空閑。


請注意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


一般意義的功耗=電壓*電流,即電壓越高越耗電。

電流又和三晶體管開關有關,每次晶體管狀態切換都要耗電,不切換則基本不耗電,具體來說就是當cpu執行某種運算時,會開始耗電,運算頻率越高,越耗電。

while(1)底層是在不斷執行跳轉指令,因此cpu不斷地在執行指令,全力耗電,雖然說是無用功。


推薦閱讀:

cpu那麼多晶體管組成的門電路代表不同的邏輯,那麼輸入的代碼是怎樣找到確定的邏輯的?
cpu是怎麼製造的?
平面設計電腦應該如何配置?

TAG:中央處理器CPU | CPU佔用率 | CPU設計 |