0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

一文搞懂linux cpu dvfs

sakobpqhz6 ? 來源:黑客與攝影師 ? 2023-03-07 11:35 ? 次閱讀

1.介紹

CPU dvfs(dynamic voltage frequency scaling)子系統(tǒng)負(fù)責(zé)cpu運行時,對其頻率及電壓進行調(diào)整,以求性能滿足的前提下,cpu的功耗盡可能低。

芯片的CMOS電路的功耗有個計算公式,比較復(fù)雜,簡單來說功耗跟電壓平方成正比,跟頻率成正比,因此CPU dvfs在涉及到電壓調(diào)整的時候,功耗受益還是很明顯的。 但是僅調(diào)頻的話,收益是比較小的,因為頻率對應(yīng)著算力,當(dāng)頻率減少,對應(yīng)的算力也減弱,這樣執(zhí)行時間也會變長。

CPU dvfs framework(也常被稱為cpufreq framework)和其他的linux framework類似。 主要解決兩個問題:什么時候調(diào)頻調(diào)壓,怎么調(diào)頻調(diào)壓。 cpufreq driver提供調(diào)頻調(diào)壓的機制,cpufreq governor提供不同的策略,cpufreq core對通用的調(diào)頻邏輯做抽象,為上層提供功能、接口封裝,對下層調(diào)用抽象封裝的硬件控制接口。 此外,還借助頻率電壓對opp(operating performance points)功能,clk driver、regulator driver對頻率及電壓做硬件時鐘及電壓的調(diào)整。

2. 框架

wKgaomQGsQuAfLuBAAEKvVhe-Wk418.png

cpufreq core:是cpufreq framework的核心模塊,和kernel其它framework類似,主要實現(xiàn)三類功能

抽象調(diào)頻調(diào)壓的公共邏輯和接口,主要圍繞struct cpufreq_driver、struct cpufreq_policy和struct cpufreq_governor三個數(shù)據(jù)結(jié)構(gòu)進行

以sysfs的形式向用戶空間提供統(tǒng)一的接口,以notifier的形式向其它driver提供頻率變化的通知。

提供CPU頻率和電壓控制的驅(qū)動框架,方便底層driver的開發(fā); 同時,提供governor框架,用于實現(xiàn)不同的頻率調(diào)整機制。

cpufreq governor:負(fù)責(zé)調(diào)頻調(diào)壓的各種策略,每種governor計算頻率的方式不同,根據(jù)提供的頻率范圍和參數(shù)(閾值等),計算合適的頻率。

userspace:用戶通過操作scaling_setspeed文件節(jié)點操作頻率及電壓的調(diào)整。

ondemand:根據(jù)CPU當(dāng)前的使用率,動態(tài)調(diào)整cpu的頻率及電壓。 Sched通過調(diào)用ondemand注冊進來的回調(diào)函數(shù)來觸發(fā)負(fù)載的估算,它以一定時間間隔對系統(tǒng)負(fù)載進行采樣,按需調(diào)整cpu的頻率及電壓,若當(dāng)前cpu的利用率超過設(shè)定的閾值,就會立即調(diào)整到最大的頻率。 調(diào)頻速度快,但是不夠精確。

conservative:類似ondemand,在調(diào)頻調(diào)節(jié)時會平滑一下,以防最大、最小頻率之間來回跳變。 調(diào)整的時候會以一定步長調(diào)整,而不是直接調(diào)整到目標(biāo)值。 同時會周期的計算系統(tǒng)負(fù)載,用以決定調(diào)到什么頻率。

schedutil:通過將自己的調(diào)頻策略注冊到hook,在負(fù)載發(fā)生變化的時候,會調(diào)用該hook,此時就可以進行調(diào)頻決策或執(zhí)行調(diào)頻動作。 前面的調(diào)頻策略都是周期采樣計算cpu負(fù)載有滯后性,精度也有限,而schedutil可以使用PELT(per entity load tracking)或者WALT(window assist load tracking)準(zhǔn)確的計算task的負(fù)載。 如果支持fast_switch的功能,可以在中斷上下文直接進行調(diào)頻。

cpufreq driver:負(fù)責(zé)平臺相關(guān)的調(diào)頻調(diào)壓機制的實現(xiàn),基于cpu subsystem driver、OPP、clock driver、regulator driver等模塊,提供對CPU頻率和電壓的控制。

cpufreq stats:負(fù)責(zé)調(diào)頻信息和各頻點運行時間等統(tǒng)計,提供每個cpu的cpufreq有關(guān)的統(tǒng)計信息。

3. 數(shù)據(jù)結(jié)構(gòu)

struct cpufreq_policy:linux使用cpufreq policy來抽象cpu設(shè)備的調(diào)頻調(diào)壓功能,用于描述不同的policy,包含頻率表、cpuinfo等各種信息,并且每個policy都會對應(yīng)某個具體的governor。

struct cpufreq_governor:不同policy的管理策略,根據(jù)使用場景的不同,會有不同的調(diào)頻調(diào)壓策略。

struct cpufreq_driver:用于描述cpufreq的驅(qū)動,是驅(qū)動工程師最關(guān)注的結(jié)構(gòu)。

wKgaomQGsQuAIzpxAAYXbFnVRYI807.png

4. 初始化及工作流程

4.1 初始化流程

cpufreq_register_driver函數(shù)為cpufreqdriver注冊的入口,驅(qū)動程序通過調(diào)用該函數(shù)進行初始化,并傳入相關(guān)的struct cpufreq_driver,cpufreq_register_driver會調(diào)用subsys_interface_register,最終執(zhí)行回調(diào)函數(shù)cpufreq_add_dev。

系統(tǒng)中可以同時存在多個governor,policy通過cpufreq_policy->governor指針和某個governor相關(guān)聯(lián)。要想一個governor能夠被使用,首先要把該governor注冊到cpufreq framework中。

cpufreq core定義了一個全局鏈表變量:cpufreq_governor_list,注冊函數(shù)首先根據(jù)governor的名稱,通過__find_governor()函數(shù)查找該governor是否已經(jīng)被注冊過,如果沒有被注冊過,則把代表該governor的結(jié)構(gòu)體添加到cpufreq_governor_list鏈表中。

wKgZomQGsQuACz41AAZH41UboPs572.png

4.2 工作流程

不同的governor的觸發(fā)調(diào)頻調(diào)壓流程不一樣,這里以scheduutil governor為例。

CFS負(fù)載變化的時候或者RT、DL任務(wù)狀態(tài)更新的時候,就會啟動調(diào)頻這幾個scheduler類會調(diào)用cpufreq_update_util函數(shù)(前面注冊進來的hook函數(shù))觸發(fā)schedutil工作。每個cpu最終會回調(diào)到sugov_upate_shared或者sugov_upate_single函數(shù)中的一個。

由于是從scheduler里直接調(diào)用下來的,最終執(zhí)行調(diào)頻切換時,無論是快速路徑觸發(fā)的簡單寫寄存器,還是慢速路徑觸發(fā)的kthread都不會占用過多時間或者調(diào)度開銷。

具體的觸發(fā)時機如下:

wKgZomQGsQuAYNmWAANxAjTsMBc757.png

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • cpu
    cpu
    +關(guān)注

    關(guān)注

    68

    文章

    10813

    瀏覽量

    210880
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11215

    瀏覽量

    208742
  • 功耗
    +關(guān)注

    關(guān)注

    1

    文章

    808

    瀏覽量

    31902
  • 數(shù)據(jù)結(jié)構(gòu)

    關(guān)注

    3

    文章

    569

    瀏覽量

    40076
  • DVFS
    +關(guān)注

    關(guān)注

    1

    文章

    17

    瀏覽量

    11982
收藏 人收藏

    評論

    相關(guān)推薦

    搞懂Linux內(nèi)核鏈表

    hello 大家好,今天給大家介紹linux 內(nèi)核鏈表的分析,在寫這篇文章前,筆者自己以前也只是停留在應(yīng)用層面,沒有深究其中的細(xì)節(jié),很多也是理解的不是很透徹。寫完此文后,發(fā)現(xiàn)對鏈表的理解更加深刻了。很多現(xiàn)代計算機的思想在內(nèi)核里面都有體現(xiàn)。
    發(fā)表于 11-14 09:17 ?1052次閱讀

    搞懂CPU工作原理

    中央處理器(Central Processing Unit,簡稱CPU)是塊由超大規(guī)模的集成電路組成的運算和控制核心,主要功能是運行指令和處理數(shù)據(jù)?,F(xiàn)在CPU般都比較小,基本上只有
    發(fā)表于 03-07 11:27 ?4764次閱讀
    <b class='flag-5'>一</b><b class='flag-5'>文</b><b class='flag-5'>搞懂</b><b class='flag-5'>CPU</b>工作原理

    搞懂Linux進程的睡眠和喚醒

    。通過PPID,可以追蹤進程的來源,并了解進程之間的關(guān)系。 在PCB中記錄的進程狀態(tài),不過是些整數(shù),這個整數(shù)是多少就代表進程此時處于什么狀態(tài)。在CPU執(zhí)行進程時,通過找到進程的PCB,從而找到進程
    發(fā)表于 11-04 15:15

    關(guān)于DVFS與AVS

    請問工程師,在SmartReflex中的DVFS與AVS兩種方式的區(qū)別是什么,謝謝
    發(fā)表于 06-21 03:32

    搞懂UPS主要內(nèi)容

    導(dǎo)讀:UPS是系統(tǒng)集成項目中常用到的設(shè)備,也是機房必備的設(shè)備。本文簡單介紹了UPS的種類、功能、原理,品質(zhì)選擇與配置選擇方式,基礎(chǔ)維護等相關(guān)的內(nèi)容。搞懂UPS本文主要內(nèi)容:UPS種類、功能
    發(fā)表于 09-15 07:49

    搞懂開關(guān)電源波紋的產(chǎn)生

    參考搞懂開關(guān)電源波紋的產(chǎn)生、測量及抑制開關(guān)電源紋波的產(chǎn)生上圖是開關(guān)電源中最簡單的拓?fù)浣Y(jié)構(gòu)-buck降壓型電源。隨著SWITCH的開關(guān),電感L中的電流也是在輸出電流的有效值上下波動的。所以在輸出端
    發(fā)表于 12-30 08:31

    Linux CPU的性能應(yīng)該如何優(yōu)化

    Linux系統(tǒng)中,由于成本的限制,往往會存在資源上的不足,例如 CPU、內(nèi)存、網(wǎng)絡(luò)、IO 性能。本文,就對 Linux 進程和 CPU 的原理進行分析,總結(jié)出
    的頭像 發(fā)表于 01-18 08:52 ?3325次閱讀

    搞懂幾種常見的射頻電路類型及主要指標(biāo)

    搞懂幾種常見的射頻電路類型及主要指標(biāo)。
    發(fā)表于 07-27 10:26 ?9次下載
    <b class='flag-5'>一</b><b class='flag-5'>文</b><b class='flag-5'>搞懂</b>幾種常見的射頻電路類型及主要指標(biāo)

    嵌入式Linux開發(fā)系統(tǒng)開發(fā)之《節(jié)課搞懂文件IO與標(biāo)準(zhǔn)IO》

    嵌入式Linux開發(fā)系統(tǒng)開發(fā)之《節(jié)課搞懂文件IO與標(biāo)準(zhǔn)IO》http://www.makeru.com.cn/live/5413_2293.html?s=47236
    發(fā)表于 11-01 17:37 ?10次下載
    嵌入式<b class='flag-5'>Linux</b>開發(fā)系統(tǒng)開發(fā)之《<b class='flag-5'>一</b>節(jié)課<b class='flag-5'>搞懂</b>文件IO與標(biāo)準(zhǔn)IO》

    搞懂CPU、MPU、MCU、SOC的聯(lián)系與區(qū)別

    1 CPU CPU(Central Processing Unit),是臺計算機的運算核心和控制核心。CPU由運算器、控制器和寄存器及實現(xiàn)它們之間聯(lián)系的數(shù)據(jù)、控制及狀態(tài)的總線構(gòu)成。主
    的頭像 發(fā)表于 04-05 13:45 ?4.3w次閱讀
    <b class='flag-5'>一</b><b class='flag-5'>文</b><b class='flag-5'>搞懂</b><b class='flag-5'>CPU</b>、MPU、MCU、SOC的聯(lián)系與區(qū)別

    Linux環(huán)境編程必須搞懂的幾個概念

    Linux環(huán)境編程對于初學(xué)者來說,必須深刻理解重點概念才能更好地編寫代碼,實現(xiàn)業(yè)務(wù)功能,下面就幾個重要的及常用的知識點進行說明。搞懂這幾個概念后以免在將來的編碼出現(xiàn)混淆。
    的頭像 發(fā)表于 02-12 16:57 ?632次閱讀

    linux cpu dvfs介紹

    CPU dvfs(dynamic voltage frequency scaling)子系統(tǒng)負(fù)責(zé)cpu運行時,對其頻率及電壓進行調(diào)整,以求性能滿足的前提下,cpu的功耗盡可能低。
    的頭像 發(fā)表于 03-07 11:36 ?2029次閱讀

    搞懂Linux系統(tǒng)內(nèi)核的重要性

    今天我要跟大家分享Linux內(nèi)核的重要性。內(nèi)核就像Linux系統(tǒng)運行的大心臟,對系統(tǒng)的運行起到了至關(guān)重要的作用。那么Linux內(nèi)核到底難不難學(xué)呢?今天我就大概和大家科普
    的頭像 發(fā)表于 03-24 15:16 ?869次閱讀
    <b class='flag-5'>一</b><b class='flag-5'>文</b><b class='flag-5'>搞懂</b><b class='flag-5'>Linux</b>系統(tǒng)內(nèi)核的重要性

    掌握Linux常用命令

    掌握Linux40個命令
    的頭像 發(fā)表于 04-03 11:38 ?624次閱讀

    搞懂CPU、MPU、MCU、SOC的概念與區(qū)別

    1.概念CPU(CentralProcessingUnit)CPU(CentralProcessingUnit),是臺計算機的運算核心和控制核心。CPU由運算器、控制器和寄存器及實現(xiàn)
    的頭像 發(fā)表于 09-30 09:51 ?1.6w次閱讀
    <b class='flag-5'>一</b><b class='flag-5'>文</b><b class='flag-5'>搞懂</b><b class='flag-5'>CPU</b>、MPU、MCU、SOC的概念與區(qū)別