CPU的瞬時功耗是由什麼決定的?
先來闡述一個很常見的現象:當你的電腦閑置的時候,溫度不是很高,所以風扇不轉。而當你玩大型遊戲的時候,因為CPU和顯卡都在滿功率運作所以會產生大量的熱,溫度很高,然後風扇轉得很快。這個現象說明,電腦在做不同的事情的時候功耗是不同的。但是根據我所了解的知識,CPU只是按照一定頻率(振蕩頻率)不斷地讀取指令、執行指令、PC++。所以在我的感覺上不管電腦在運行什麼,CPU都是持續做著等價工作的,所以應該不存在功耗變化的情況。我在想功率變化的原因是不是因為nop指令有可能不怎麼耗電,然後操作系統在任務少的時候在程序裡面穿插很多nop,這樣等價於降低一點CPU的速度,也降低一點功耗。還是有其他什麼技術,比如能夠改變振蕩頻率。
如果是操作系統里的演算法控制電腦的功耗的話,我想知道操作系統是怎麼判斷操作系統是否閑置的。肯定不是根據進程數量,因為一個while(1)就能佔滿CPU。(這個問題等價於計算機是怎麼計算CPU佔用率的)有一個例外,就是當我電腦一直開在grub2(引導)界面的時候,溫度也會飆升,我在想是不是這種引導程序沒有上述的優化。
處理器是典型的容性元件,功率主要是動態功率
拿最入門的晶元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經常卡爆),它發燒也正常。推薦閱讀:
※學校開設關於編程的課程明顯不足,我需要補充哪些課程或者自學哪些姿勢技能來提高自己的編程水平?
※哪些學習數據結構與演算法的書籍值得推薦?
※物聯網工程這個專業到底怎麼樣?報考哪所學校的物聯網專業比較好呢?
※為什麼中文不能做變數名?