CPU的瞬時功耗是由什麼決定的?

先來闡述一個很常見的現象:當你的電腦閑置的時候,溫度不是很高,所以風扇不轉。而當你玩大型遊戲的時候,因為CPU和顯卡都在滿功率運作所以會產生大量的熱,溫度很高,然後風扇轉得很快。這個現象說明,電腦在做不同的事情的時候功耗是不同的。但是根據我所了解的知識,CPU只是按照一定頻率(振蕩頻率)不斷地讀取指令、執行指令、PC++。所以在我的感覺上不管電腦在運行什麼,CPU都是持續做著等價工作的,所以應該不存在功耗變化的情況。我在想功率變化的原因是不是因為nop指令有可能不怎麼耗電,然後操作系統在任務少的時候在程序裡面穿插很多nop,這樣等價於降低一點CPU的速度,也降低一點功耗。還是有其他什麼技術,比如能夠改變振蕩頻率。

如果是操作系統里的演算法控制電腦的功耗的話,我想知道操作系統是怎麼判斷操作系統是否閑置的。肯定不是根據進程數量,因為一個while(1)就能佔滿CPU。(這個問題等價於計算機是怎麼計算CPU佔用率的)

有一個例外,就是當我電腦一直開在grub2(引導)界面的時候,溫度也會飆升,我在想是不是這種引導程序沒有上述的優化。


處理器是典型的容性元件,功率主要是動態功率

P_	ext{dyn} = p_f CV^2F

C 是寄生電容,是製造時候決定的

V 為電壓,F 為主頻率,這個運行時也不大會變化

那麼和負載相關性最高的就是 p_f 翻轉概率,處理器閑置(不同處理器是不同的,x86 有個 HLT 可以讓 cpu 專門等中斷,一些其他架構就得跑死循環了)的時候內部的各種 CMOS 閘狀態都不變,寄生電容沒有充放電,功耗最低;負載高的時候,CMOS 狀態變化頻繁,功耗大。這也解釋了為什麼不同的烤機軟體烤出來溫度會不一樣,因為即使都把流水線佔滿,翻轉概率值仍然是不同的。


拿最入門的晶元STM32來說,RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);這句話就能實現增加功耗的效果


中央處理器已經決定啦,由頻率來影響瞬時功耗


作一個不太嚴謹的比喻

cpu就相當於一個超級大型的算盤,算盤上的珠子保持原狀並不需要費力氣,只有在撥動珠子的時候才費力氣。(維持電位不消耗能量,只有電位翻轉時消耗能量)

待機的時候珠子只有小部分被撥動,費的力氣小,所以功耗低

滿載的時候珠子大部分都在被撥動,費的力氣大,所以功耗高。

時鐘就相當於打算盤的人的手速,他的手速有多快,決定了最高性能。


用不到的核心或者部件如L1L2可以關閉,這部分電路就可以省去發熱了吧

而且不同的任務涉及到的部件的確不同,烤fpu的負載和空循環的負載的確是不同的。

不過能耗也不是跟任務負載成正比,因為哪怕只有50%的負載,可能大部分部件都要開著,也可能都要隨機的被使用到無法關閉(個人經驗,同頻率下,高強度計算任務跑3個線程和6個線程,顯示tpd相差不大)

另外還有中斷在,cpu會等待。CPU可能在1s內偷偷歇了好幾個ms。

然後就是動態調節頻率了,一般都能懂。值得注意的是電壓一般也是隨著變的,所以頻率越高發熱量增長越快

至於操作系統怎麼判斷,那就似乎比較高深了。不過操作系統說到底也只是軟體,很多東西也不是操作系統控制的。課上經典的說法是時間片輪轉,操作系統為各個線程分配時間片。線程如果遇到資源阻塞要等待了,cpu自發就會去歇息。如果線程讓出了這個時間片,cpu就接著忙下一個任務了。

不是專業的,拋磚引玉,理解有誤請指出


說到CPU功耗肯定要提到「Thermal Design Power」中文叫「熱設計功耗」。TDP的單位是(W)

TDP是有閥值的,我們平常使用計算機的時候肯定是達不到TDP的閥值,因為TDP指的是核心熱效應及處理器其它運行晶體產生的熱能。TPD跟CPU功耗(也叫功率)一樣,最終均以熱的形式釋放。TPD越高代表CPU的發熱量越大,CPU功耗越高代表性能越好。我們肯定想要的是高性能低熱量,所以TDP越小越好。

操作系統(OS)是凌駕於應用層的,操作系統的穩定本身就需要佔用處理器,RAM 外存儲器等等部分資源的,所以這部分功耗是從計算機本身啟動時就必須維持的。

有多大的處理量,處理器就會去進行運算,處理器的工作方式就是被動的。


不不不,題主你的認識,很多都是錯誤的。

現代的CPU的電源管理可以做到根據負載調整頻率,調整電壓,甚至在低負載的時候關閉一些核心。功耗和頻率3次方成正比,低負載時光把頻率減半,功耗就能降到1/8。

另外其實CPU負載也不是什麼太神秘的東西。CPU絕不是任何時候都在跑指令。負載低的時候,CPU在絕大多數時間裡其實是在等待。等緩存,等內存,等IO。如果CPU一直在跑指令那是滿載了。


電頻如果不翻轉(即1變0,0變1),產生的功率是基本上是0。因此你的軟體指令越少,單位時間用到的單元模塊就越少,功率就越少。現在的CPU都是多核,一個核內多線程,多個相同的單位。軟體程序大部分情況下是只佔用部分,很多情況下一些硬體是沒有功耗的


CPU真正的功耗很大程度上是運行的軟體決定的,軟體越膨大越複雜功耗越高,反之越低。


顯然瞬時功率是物理上的功率,也就是其他答主說的微電子上的三類功率中的動態功率佔主要部分。

不管操作系統如何設計,不管是流水線,還是上下文切換達到多任務、多線程的目的,都是為了可以充分利用cpu的計算能力,流水線夠深的話就可以有計算機同時處理很多事的錯覺。

而動態功率就是計算時,數據產生變化導致存儲器產生動態功率。

如果任務少工作量小,cpu沒有全力跑,那電腦不熱還是很正常的,即使是while(1)對計算機來說還是工作量不大。

而打一些大型遊戲,裡面的圖像處理、場景變換、一些對戰數據的計算並實時更新對處理器來說是真的大任務(matlab經常卡爆),它發燒也正常。


推薦閱讀:

學校開設關於編程的課程明顯不足,我需要補充哪些課程或者自學哪些姿勢技能來提高自己的編程水平?
哪些學習數據結構與演算法的書籍值得推薦?
物聯網工程這個專業到底怎麼樣?報考哪所學校的物聯網專業比較好呢?
為什麼中文不能做變數名?

TAG:操作系統 | 中央處理器CPU | 計算機科學 | 電腦硬體 | 功率 |