動態熱功耗管理框架¶
在嵌入式領域,SoC 的複雜性導致需要監控和緩解的熱點數量不斷增加,以便防止溫度超過規範和法律規定的“皮膚溫度”。
另一個方面是在給定的功耗預算下維持效能,例如虛擬現實,如果當一個大的 CPU 在處理其他事情時效能受到限制,使用者會感到頭暈。或者減少電池充電,因為與其他裝置消耗的功率相比,耗散的功率太高。
使用者空間是最適合透過限制不同裝置的功率來根據應用程式配置檔案動態操作這些裝置的地方:它瞭解平臺的知識。
動態熱功耗管理 (DTPM) 是一種透過限制和/或平衡不同裝置之間的功耗預算來作用於裝置功耗的技術。
DTPM 框架提供了一個統一的介面來作用於裝置功耗。
概述¶
DTPM 框架依賴於 powercap 框架在 sysfs 目錄中建立 powercap 條目,並實現後端驅動程式以進行與電源可管理裝置的連線。
DTPM 是一種樹狀表示,描述了裝置之間共享的功率約束,而不是它們的物理位置。
樹的節點是一個虛擬描述,它聚合了子節點的功率特性及其功率限制。
樹的葉子是真正的功率可管理裝置。
例如
SoC
|
`-- pkg
|
|-- pd0 (cpu0-3)
|
`-- pd1 (cpu4-5)
pkg 功率將是 pd0 和 pd1 功率數值的總和
SoC (400mW - 3100mW)
|
`-- pkg (400mW - 3100mW)
|
|-- pd0 (100mW - 700mW)
|
`-- pd1 (300mW - 2400mW)
當節點插入到樹中時,它們的功率特性會傳播到父節點
SoC (600mW - 5900mW)
|
|-- pkg (400mW - 3100mW)
| |
| |-- pd0 (100mW - 700mW)
| |
| `-- pd1 (300mW - 2400mW)
|
`-- pd2 (200mW - 2800mW)
每個節點都有一個以 2^10 為基數的權重,反映了兄弟節點之間功率消耗的百分比
SoC (w=1024)
|
|-- pkg (w=538)
| |
| |-- pd0 (w=231)
| |
| `-- pd1 (w=794)
|
`-- pd2 (w=486)
Note the sum of weights at the same level are equal to 1024.
當對節點應用功率限制時,它會根據子節點的權重在子節點之間分配。例如,如果我們在“SoC”根節點上設定 3200mW 的功率限制,則生成的樹將是
SoC (w=1024) <--- power_limit = 3200mW
|
|-- pkg (w=538) --> power_limit = 1681mW
| |
| |-- pd0 (w=231) --> power_limit = 378mW
| |
| `-- pd1 (w=794) --> power_limit = 1303mW
|
`-- pd2 (w=486) --> power_limit = 1519mW
平面描述¶
建立一個根節點,它是所有節點的父節點。此描述是最簡單的,它應該為使用者空間提供所有支援功率限制的裝置的平面表示,而無需任何功率限制分配。
分層描述¶
支援功率限制的不同裝置以分層方式表示。有一個根節點,所有中間節點都將子節點分組,這些子節點也可以是中間節點或真實裝置。
中間節點聚合功率資訊並允許根據節點的權重設定功率限制。
使用者空間 API¶
如概述中所述,DTPM 框架建立在 powercap 框架之上。因此 sysfs 介面是相同的,有關更多詳細資訊,請參閱 powercap 文件。
power_uw: 瞬時功耗。如果節點是中間節點,則功耗將是所有子節點功耗的總和。
max_power_range_uw: 最大功率減去最小功率得到的功率範圍。
name: 節點的名稱。這取決於實現。即使不建議使用者空間這樣做,多個節點也可以具有相同的名稱。
constraint_X_name: 約束的名稱。
constraint_X_max_power_uw: 可應用於節點的最大功率限制。
constraint_X_power_limit_uw: 要應用於節點的功率限制。如果設定了 constraint_X_max_power_uw 中包含的值,則將刪除約束。
constraint_X_time_window_us: 此檔案的含義將取決於約束編號。
約束¶
約束 0:功率限制立即應用,沒有時間限制。
核心 API¶
概述¶
DTPM 框架沒有功率限制後端支援。它是通用的,並提供了一組 API,允許不同的驅動程式實現功率限制的後端部分並建立功率約束樹。
由平臺提供初始化函式來分配和連結樹的不同節點。
一個特殊的宏的作用是透過描述結構宣告一個節點和相應的初始化函式。此結構包含一個可選的父欄位,允許在啟動時將不同的裝置掛接到已存在的樹上。
例如
struct dtpm_descr my_descr = {
.name = "my_name",
.init = my_init_func,
};
DTPM_DECLARE(my_descr);
DTPM 樹的節點用 dtpm 結構描述。新增新的可功率限制裝置的步驟分三個步驟完成
分配 dtpm 節點
設定 dtpm 節點的功率數值
註冊 dtpm 節點
dtpm 節點的註冊透過 powercap ops 完成。基本上,它必須實現回撥函式來獲取和設定功率和限制。
或者,如果要插入的節點是一箇中間節點,則可以使用一個簡單的函式將其作為未來的父節點插入。
如果裝置的功率特性發生變化,則必須使用新的功率數值和權重更新樹。
命名法¶
dtpm_alloc() : 分配和初始化 dtpm 結構
dtpm_register() : 將 dtpm 節點新增到樹中
dtpm_unregister() : 從樹中刪除 dtpm 節點
dtpm_update_power() : 更新 dtpm 節點的功率特性