1. 程式人生 > >Android系統功耗優化之CPU

Android系統功耗優化之CPU

現在的處理器都支援DVFS - 動態頻率電壓調整,我們都知道DVFS的設計是為了low power,那麼CPU頻率和功耗之間的關係如何,執行在相同頻率處理A任務和B任務功耗就一樣嗎?

同任務不同頻率

在某Android平臺,在單執行緒執行dhrystone的情況下, 可以看到隨著DMIPS的增加(其實也就是頻率的增加),Power資料前期相對平緩,後面就變陡了,越高頻率功耗增加的越多(7000 DMIPS 功耗是400mW,頻率加倍 14000 DMIPS 功耗1380mW,雖然效能是2倍,但是功耗變成了3.45倍)

在這裡插入圖片描述

關於CPU功耗和電壓頻率的關係有一個公式,可以看到電壓是以 V2V^2 的級別來影響功耗的

P=CV2fP = C * V^2 * f

  • P是功耗
  • C可以簡單看作一個常數,它由製程和設計等因素決定
  • V是電壓
  • f是頻率

從這裡也可以看到一個程式功耗優化的方向 - 多執行緒

假設A程式原來是單執行緒,需要2GHz的頻率來執行,現在把A程式改造成2個執行緒的,那理論上兩個cpu 1GHz就夠(參考某平臺A53 2GHz-0.8V 1GHz-0.6V),而且處理時間相同
代入公式

  • 單執行緒 2GHz
    Psingle=C0.8V22GHzP_{single} = C * 0.8V^2 * 2GHz

  • 2執行緒 1GHz
    Pmul

    ti=2C0.6V21GHzP_{multi} = 2 * C * 0.6V^2 * 1GHz

  • 結果
    Psingle=1.78PmultiP_{single} = 1.78 * P_{multi}

也就是說這種情況下, 維持效率不變, A程式的單執行緒會比雙執行緒功耗高出78%

同頻率不同任務

不同任務的場景相對複雜,比如有些任務是間斷性性的,期間CPU可能處於空閒狀態,當然功耗會低,為了比較方便,我們統一選取持續性負載的任務,測試期間一直佔用CPU

在某Android平臺上使用elephant stress的 分別使用單執行緒md5演算法和sha-256演算法,CPU都是處在最高頻率,而且從trace資訊也可以看到任務一直處於佔用CPU的狀態

  • 任務1 sha-256演算法

systrace CPU佔用
在這裡插入圖片描述

功耗430mA 4V
在這裡插入圖片描述

  • 任務2 md5演算法

systrace CPU佔用
在這裡插入圖片描述

功耗300mA 4V
在這裡插入圖片描述

從上面的實測資料可以看到,sha-256演算法的功耗會比md5演算法要高出45%, 雖然CPU都是在最高頻率執行,中間也沒有出現idle或者是空閒的情況。

關於這個問題有一篇知乎的文章知乎的文章講的比較好,套用到上面的兩個演算法來看,可以簡單理解為不同演算法,CPU執行時候的指令是有很大差別的,不同的指令又對應不同數量和型別的電晶體,每條指令所要調動的電晶體數目不同(fetch,decode,excute,memory),而功耗是被調動電晶體功耗的總和。

所以雖然我們看到同樣的頻率,CPU的佔用率也是滿的,但是功耗是可以差別很大。