Android/Linux Thermal Governor之IPA分析與使用
IPA(Intelligent Power Allocator)模型的核心是利用PID控制器,Thermal Zone的溫度作為輸入,可分配功耗值作為輸出,調節Allocator的頻率和電壓值。
由Power Management一般開發模型可知,包括模型建立,模型實現,驗證。
1 IPA模型
PID控制器在Sustainable Power基礎上,根據當前溫度和Control Temp之間的差值,來調節可分配功耗值的大小,進而調節Cooling裝置的狀態,也即調整OPP(Voltage和Frequency組合)。
所謂Sustainable Power是在不同OPP情境下,某一個最大OPP的溫度保持基本穩定。比其大者,溫度上升明顯;比其小者溫度保持不變或者下降。這可以通過監測不同OPP對應的溫度值,得到一個Sustainable Power。
另一個就是根據當前環境預估下一個場景功耗值。一般認為包括兩部分Dynamic Power和Static Leakage,這是由實測過程中得出的經驗。Dynamic Power可以認為跟Voltage和Frequency相關;Static Leakage跟Voltage和Temperature有關。根據實測得到的資料,進行分析得到最吻合資料的一組算式。由於的HiKey實測中,Static Leakage比較小,就被忽略了。所以最終Power值就只跟Voltage和Frequency相關,據此就可以算出OPP對應的功耗值。OPP和功耗之間就建立了聯絡。
在一個重要引數就是PID控制器的引數P、I、D的確定,這部分也存在一定的經驗值。需要測試幾組不同引數,然後看溫度控制效果。
2 IPA測試環境
1. 在最靠近CPU的地方引出測試點。
2. 接出Ground、V+、V-到ARM Energy Probe。
3. 通過軟體設定特殊狀態:
1. 對於sustainable power需要將8核跑在100%workload。
2. 對於測試Cluster Power和CPU Power就比較複雜,下面單列。
4. 使用Ipython指令碼讀取Thermal Zone溫度和測試點功耗。
HiKey對應的Cluster和CPU功耗狀態如下:
Power State |
PD_CPUx/CLKIN |
PDCORTEXA53 |
PD_L2 |
LinuxKernel |
|
CPU |
CPU P-State |
On |
On |
On |
P-State |
WFI |
On, internal clock gating |
On |
On |
C-State |
|
CPU Off |
Off |
On |
On |
C-State |
|
Cluster |
Cluster P-State |
On or Off |
On |
On |
P-State |
Cluster L2 Retention |
Off |
Off |
Retention |
C-State |
|
Cluster Off |
Off |
Off |
Off |
C-State |
圖表 1 HiKey Cluster和CPU狀態
3 IPA重要引數
sustainable-power
OPP(MHz) |
Sustainable power |
729 |
2155 |
960 |
3326 |
1200 |
5285 |
圖表 2 Sustainable power
sustainable-power在thermal-zone裡面,是因為測量的溫度是基於thermal-sensors的,然後每個thermal-zone包含若干trips和cooling-maps。
通過觀察溫度,在729MHz的時候溫度不會增加,在960MHz的時候溫度緩慢增加,在1200MHz的時候溫度增加很快。所以確定sustainable-power在960MHz。
在Thermal框架中有一個work queue會去輪詢thermal_zone_device_check,根據Trip型別不同會執行不同的delay,passive模式100ms,其他1000ms。
control_temp
IPA模型有兩個溫度引數很重要,當溫度低於65C的時候IPA處於關閉模式,reset PID控制器。當溫度高於65C,IPA開始起作用;75C是IPA的control_temp,也即高於75C,IPA就會考慮降低可分配功耗,以達到降低溫度的目的。
圖表 3 Thermal Zones DTS
對於cooling-maps,需要上下兩張圖結合理解。trip表示在target開始啟動cooling;contribution是針對對個Allocator進行權重分配;cooling-device引數是<裝置 min max>。這裡面設定的min和max需要在cooling-min-level和cooling-max-level之間。cpufreq會將對應值轉換成OPP對應的voltage和frequency進行設定。
dynamic-power-coefficient
echo 0 > /sys/devices/system/cpu/cpu[1…7]/online,關閉CPU1-CPU7,只保留CPU0。
echo mem > /sys/power/state,通過對核心程式碼hack使SoC相對於CPU0工作狀態,逐漸關閉CPU0,Cluster0,整個SoC。得到如下資料:
OPP(MHz) |
Voltage(V) |
Cluster Power Off State (mW) |
Cluster P-State (mW) |
Cluster Power (mW) |
CPU WFI (mW) |
CPU P-State (mW) |
CPU Dynamic Power(mW) |
208 |
1.04 |
344 |
360 |
16 |
379 |
429 |
69 |
432 |
1.04 |
345 |
374 |
29 |
387 |
498 |
124 |
729 |
1.09 |
346 |
393 |
47 |
408 |
617 |
224 |
960 |
1.18 |
352 |
427 |
75 |
442 |
794 |
367 |
1200 |
1.33 |
367 |
479 |
112 |
508 |
1149 |
670 |
圖表 4 HiKey功耗測試資料
功耗計算公式:
power = dyn_coeff * (freq * volt^2) + static_coeff * F(volt) * F(Temp)
Dynamic power = capacitance * (freq * volt^2)
Cluster model |
|||||
Freq |
Voltage |
F * V^2 |
Power |
Model power |
Zero model |
208 |
1.04 |
224.9728 |
16 |
16 |
12 |
432 |
1.04 |
467.2512 |
29 |
29 |
25 |
729 |
1.09 |
866.1249 |
47 |
49 |
47 |
960 |
1.18 |
1336.704 |
75 |
73 |
72 |
1200 |
1.33 |
2122.68 |
112 |
113 |
115 |
Gradient (capacitance) |
Intercept (staic power) |
||||
Linear regression |
0.051 |
4.716716513 |
|||
L.R. thru zero |
0.054 |
0 |
圖表 5 Cluster係數計算
圖表 6 Cluster線性圖表
CPU model |
|||||
Freq |
Voltage |
F * V^2 |
Power |
Model power |
Zero model |
208 |
1.04 |
224.9728 |
69 |
44 |
67 |
432 |
1.04 |
467.2512 |
124 |
121 |
139 |
729 |
1.09 |
866.1249 |
224 |
247 |
258 |
960 |
1.18 |
1336.704 |
367 |
396 |
399 |
1200 |
1.33 |
2122.68 |
670 |
645 |
633 |
Gradient (capacitance) |
Intercept (staic power) |
||||
Linear regression |
0.317 |
-27.12625497 |
|||
L.R. thru zero |
0.298 |
0 |
圖表 7 CPU功耗係數計算
圖表 8 CPU線性圖示
由以上Cluster和CPU的coefficient得到,dynamic-power-coefficient = (0.298 + (0.054/4 CPUs)) * 1000 = 311。
LINEST:使用最小二乘法對已知資料進行最佳直線擬合,然後返回描述此直線的陣列。
LINEST(known_y's,known_x's,const,stats) Known_y's 是關係表示式 y = mx + b 中已知的 y 值集合。 如果陣列 known_y's 在單獨一列中,則 known_x's 的每一列被視為一個獨立的變數。 如果陣列 known_y's 在單獨一行中,則 known_x's 的每一行被視為一個獨立的變數。 Known_x's 是關係表示式 y = mx + b 中已知的可選 x 值集合。 陣列 known_x's 可以包含一組或多組變數。如果僅使用一個變數,那麼只要 known_x's 和 known_y's 具有相同的維數,則它們可以是任何形狀的區域。如果用到多個變數,則 known_y's 必須為向量(即必須為一行或一列)。 如果省略 known_x's,則假設該陣列為 {1,2,3,...},其大小與 known_y's 相同。 Const 為一邏輯值,用於指定是否將常量 b 強制設為 0。 如果 const 為 TRUE 或省略,b 將按正常計算。 如果 const 為 FALSE,b 將被設為 0,並同時調整 m 值使 y = mx。 Stats 為一邏輯值,指定是否返回附加回歸統計值。 如果 stats 為 TRUE,則 LINEST 函式返回附加回歸統計值,這時返回的陣列為 {mn,mn-1,...,m1,b;sen,sen-1,...,se1,seb;r2,sey;F,df;ssreg,ssresid}。 如果 stats 為 FALSE 或省略,LINEST 函式只返 |
4 IPA實現
static struct thermal_governor thermal_gov_power_allocator = { .name = "power_allocator", .bind_to_tz = power_allocator_bind, .unbind_from_tz = power_allocator_unbind, .throttle = power_allocator_throttle, }; |
static int power_allocator_bind(struct thermal_zone_device *tz) |
Power Allocator的結構體,包括三個核心函式power_allocator_bind、power_allocator_unbind、power_allocator_throttle。
初始化PID控制器的引數並且將power_allocator_params繫結到tz->governor_data。
struct power_allocator_params { bool allocated_tzp; s64 err_integral; //accumulated error in the PID controller s32 prev_err; //error in the previous iteration of the PID controller int trip_switch_on; //first passive trip point of the thermal zone. The governor switches on when this trip point is crossed. int trip_max_desired_temperature; //last passive trip point of the thermal zone. The temperature we are controlling for. }; |
PID引數
if (!tz->tzp->k_po || force) tz->tzp->k_po = int_to_frac(sustainable_power) / temperature_threshold; if (!tz->tzp->k_pu || force) tz->tzp->k_pu = int_to_frac(2 * sustainable_power) / temperature_threshold; if (!tz->tzp->k_i || force) tz->tzp->k_i = int_to_frac(10) / 1000; |
從DTS獲得的引數可知,temperature_threshold = control_temp - switch_on_temp = 75000-65000 = 10000。
tz->tzp->k_po = int_to_frac(sustainable_power) /temperature_threshold =3326*1024/10000=340.5824
tz->tzp->k_pu = int_to_frac(2 * sustainable_power) /temperature_threshold =3326*2*1024/10000=681.1648
tz->tzp->k_i = int_to_frac(10) / 1000 = 10*1024/1000=10.24
另兩個引數tz->tzp->k_d、tz->tzp->integral_cutoff預設為0。
PID控制器
圖表 9 power_allocator_throttle流程
power_allocator_throttle作為IPA的調節功能,首先判斷當前溫度是否小於switch_on_temp。如果小於的話,就不進入PID調節,分配最大可用功耗。反之,則使用PID進行功耗分配。當PID調節一段時間後,如果溫度低於switch_on_temp時,PID控制器的所有引數也會被重啟,所以PID控制器也會得到糾正。
圖表 10 allocate_power流程
allocate_power作為IPA的核心,遍歷所有thermal_instances,獲得actor數目及其權重;然後計算每個actor的max_power、weighted_req_power和所有actor的max_allocatable_power、total_weighted_req_power。
pid_controller根據control_temp、max_allocatable_power即pid引數計算出power_range作為下一次分配的功耗預算。
divvy_up_power基於weighted_req_power、max_power、num_actors、total_weighted_req_power、power_range在每個actor之間分配可用功耗,得出granted_power。
power_actor_set_power根據分配到的功耗設定cooling裝置。cdev->ops->power2state將功耗值轉換成cooling裝置狀態值,thermal_cdev_update的cdev->ops->set_cur_state對cooling進行設定。至此完成整個Thermal Zone的調節。
有幾個重要的概念,thermal_instance指的是特定thermal_zone中特定trip上的cooling裝置;power actor是一個功耗消耗實體,並且可進行功耗狀態轉換,能通過調節狀態達到調節功耗的目的;actor的權重,預設是1024,如果比較重要可以增加weight值,反之可以減小。功耗分配不是基於req_power而是weighted_req_power。
IPA的缺陷:PID控制器在週期性tick環境下效果比較好,如果不規則重複則可能表現不太好,比如中斷觸發。
相關推薦
Android/Linux Thermal Governor之IPA分析與使用
IPA(Intelligent Power Allocator)模型的核心是利用PID控制器,Thermal Zone的溫度作為輸入,可分配功耗值作為輸出,調節Allocator的頻率和電壓值。 由Power Management一般開發模型可知,包括模型建立,模型實現,驗證。 1 IPA模型 PID控制器在
Android業務元件化之現狀分析與探討
前言: 從個人經歷來說的話,從事APP開發這麼多年來,所接觸的APP的體積變得越來越大,業務的也變得越來越複雜,總來來說只有一句話:這是一個APP臃腫的時代!所以為了告別APP臃腫的時代,讓我們進入一個U盤時代,每個業務模組都是一個具備獨立執行的U盤,插在哪
01 整合IDEA+Maven+SSM框架的高並發的商品秒殺項目之業務分析與DAO層
初始 lob 可能 很多 ont 配置 支持 個數 base 作者:nnngu 項目源代碼:https://github.com/nnngu/nguSeckill 這是一個整合IDEA+Maven+SSM框架的高並發的商品秒殺項目。我們將分為以下幾篇文章來進行詳細的講解:
linux三劍客sed之模式空間與保持空間
linux sed 三劍客 模式空間 保持空間 pattern space(模式空間) and hold space (保持空間)(H、h、G、g、x)模式空間:sed處理文本內容行的一個臨時緩沖區,模式空間中的內容會主動打印到標準輸出,並自動清空模式空間 保持空間:sed處理文本內容行的
LINUX網絡之ifconfig命令與ping
啟用 term col lai data 五行 broadcast bin localhost ifconfig命令 網絡配置 ifconfig命令被用於配置和顯示Linux內核中網絡接口的網絡參數。用ifconfig命令配置的網卡信息,在網卡重啟後機器重啟後,配置就
Linux學習筆記之基礎命令與獲取幫助文檔
內容 大寫 用戶 協議 當前時間 switch 使用 主機 當前 一、linux的基本原則:1、 由目的單一的小程序組成,組合小程序,完成復雜任務;2、 一切皆文件;3、 盡量避免捕獲用戶接口;4、 配置文件保存為純文本格式二、shellGUI :Graphic U
網站運維技術與實踐之資料分析與報警
對於日益積累的監控資料,顯然需要有規劃地進行儲存和分析,做到“故障沒來時有預防,故障來臨時有提示,故障到來時有解決方案”。 一、時間序列儲存 對於大多數監控資料,都有一個天然的類似資料庫主鍵的屬性,那就是時間。所以,通常情況下,各類監控系統的後臺資料庫都可以認為是時間序列的資
python進階之資料分析與展示(三)
資料分析之表示 資料存取與函式 資料的CSV檔案存取 CSV (Comma‐Separated Value, 逗號分隔值) CSV是一種常見的檔案格式,用來儲存批量資料。 np.savetxt(frame, array, fmt=’%.
python進階之資料分析與展示(二)
資料分析之表示 NumPy庫入門 資料的維度 一維資料 一維資料由對等關係的有序或無序資料構成,採用線性方式組織。 例如:3.1413, 3.1398, 3.1404, 3.1401, 3.1349, 3.1376。 對應列
python進階之資料分析與展示(一)
資料分析之前奏 Anaconda IDE的使用方法 一個數據表達一個含義,一組資料表達一個或多個含義。 摘要 有損地提取資料特徵的過程。 基本統計(含排序)。 分佈/累計統計。 資料特徵。 相關性、
自然語言處理之情感分析與觀點挖掘
觀點、情感以及與之相關的許多概念,如評價、評估、態度、感情、情緒和心情,與我們主觀的感覺和感受密切相關。這些是人類心理活動的核心要素,也是影響人們日常行為的關鍵因素。情感分析也稱為觀點挖掘,是一個旨在利用可計算的方法從自然語言文字中提取觀點和情感資訊的研究課題。 一.情感分
大資料綜合專案DocCloud之需求分析與功能實現詳細(續更)
DocCloud專案需求 專案背景: 在一些大型企事業單位,工作中存在各種各樣的工作文件,技術文件,規範等等。這些文件以word,xls,ppt,wps,pdf,txt存在。在此專案之前,文件的分享主要靠單位內部人員的互相傳送。沒有一個統一的平臺對企業現存的各種文件進行統
Android java層音訊相關的分析與理解(二)音量控制相關
上一篇我們簡單地說了一下Android java層的基本框架。接下來我們就來聊一下在android中音量控制的相關內容。 1.音量定義 在Android中,音量的控制與流型別是密不可分的,每種流型別都獨立地擁有自己的音量設定,各種流型別的音量是互不干擾的,例如音樂音量、通話
OpenCV之視訊分析與物件跟蹤(五) CAMShift物件跟蹤
MeanShift演算法(均值漂移): 假設右一堆資料,不均勻的在平面空間分佈,首先通過均值計算,評估中心點在哪裡,然後中心點向高密度的地方平移,最後找到密度最高的地方。 數學描述: 找到的windows區域繪製成直方圖: 通過直方圖比較
Linux 基礎 Apache 之 正向代理與反向代理
一、正向代理 一、概念: 正向代理,意思是一個位於客戶端和原始伺服器(origin server)之間的伺服器,為了從原始伺服器取得內容,客戶端向代理髮送一個請求並指定目標(原始伺服器),然後代理向原始伺服
linux基礎學習之圖形介面與命令列介面切換
首先,開機時進入到LINUX的圖形介面 緊接著,選中左上角的Applications----system tools-----terminal 選項 注意,使用者必須為ROOT,具備最高許可權
ArcGIS Android API 應用開發之圖形繪製與長度面積量算
本文通過一個簡單的小Demo,向大家介紹如何使用ArcGIS Android API繪製點、線、面圖形,並且測量線的長度和多邊形的面積。 首先來看一下程式執行的效果圖: 實現上述功能,首先需要向地圖中新增一個GraphicsLayer,用來繪製Point、Poly
Android 漂浮類動效的分析與實現!
注:因部分原因,本篇主要講解動效分析的思路,不提供原始碼下載,請見諒 ... ... 上一篇只講了Canvas中的drawBitmap方法,並且還說的這個方法好像很膩害、能做出很多牛逼效果的樣子,
Linux 4.x 之Gpio分析(一)Gpiolib庫1
晶片定義 裝置樹 程式碼 小結 下面的內容均在imx6平臺上舉例,這一次分析希望將整個GPIO子系統的所有細節整理清晰。 第一篇從gpiolib入手,後面的邊分析邊寫. 開始之前給自己提幾個問題 驅動開發中的GPIO API 究竟是怎麼實現的
Android java層音訊相關的分析與理解(一)基本框架
最近在整理之前在公司寫的一些文件,於是決定將部分適用比較廣的文件整理在部落格中,供大家參考。第一個系列是AudioService相關的。這個可以算是《深入理解Android 卷Ⅲ》的一個讀書筆記吧。整體的思路基本上與《深入理解Android 卷Ⅲ》的Audio部分差不多。只