0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

linux cpu dvfs介绍

sakobpqhz6 来源:黑客与摄影师 2023-03-07 11:36 次阅读

介绍

CPU dvfs(dynamic voltage frequency scaling)子系统负责cpu运行时,对其频率及电压进行调整,以求性能满足的前提下,cpu的功耗尽可能低。

芯片的CMOS电路的功耗有个计算公式,比较复杂,简单来说功耗跟电压平方成正比,跟频率成正比,因此CPU dvfs在涉及到电压调整的时候,功耗受益还是很明显的。但是仅调频的话,收益是比较小的,因为频率对应着算力,当频率减少,对应的算力也减弱,这样执行时间也会变长。

CPU dvfs framework(也常被称为cpufreq framework)和其他的linux framework类似。主要解决两个问题:什么时候调频调压,怎么调频调压。cpufreq driver提供调频调压的机制,cpufreq governor提供不同的策略,cpufreq core对通用的调频逻辑做抽象,为上层提供功能、接口封装,对下层调用抽象封装的硬件控制接口。此外,还借助频率电压对opp(operating performance points)功能,clk driver、regulator driver对频率及电压做硬件时钟及电压的调整。

2.框架

f855a21e-bc22-11ed-bfe3-dac502259ad0.png

cpufreq core:是cpufreq framework的核心模块,和kernel其它framework类似,主要实现三类功能

抽象调频调压的公共逻辑和接口,主要围绕struct cpufreq_driver、struct cpufreq_policy和struct cpufreq_governor三个数据结构进行

以sysfs的形式向用户空间提供统一的接口,以notifier的形式向其它driver提供频率变化的通知。

提供CPU频率和电压控制的驱动框架,方便底层driver的开发;同时,提供governor框架,用于实现不同的频率调整机制。

cpufreq governor:负责调频调压的各种策略,每种governor计算频率的方式不同,根据提供的频率范围和参数(阈值等),计算合适的频率。

userspace:用户通过操作scaling_setspeed文件节点操作频率及电压的调整。

ondemand:根据CPU当前的使用率,动态调整cpu的频率及电压。Sched通过调用ondemand注册进来的回调函数来触发负载的估算,它以一定时间间隔对系统负载进行采样,按需调整cpu的频率及电压,若当前cpu的利用率超过设定的阈值,就会立即调整到最大的频率。调频速度快,但是不够精确。

conservative:类似ondemand,在调频调节时会平滑一下,以防最大、最小频率之间来回跳变。调整的时候会以一定步长调整,而不是直接调整到目标值。同时会周期的计算系统负载,用以决定调到什么频率。

schedutil:通过将自己的调频策略注册到hook,在负载发生变化的时候,会调用该hook,此时就可以进行调频决策或执行调频动作。前面的调频策略都是周期采样计算cpu负载有滞后性,精度也有限,而schedutil可以使用PELT(per entity load tracking)或者WALT(window assist load tracking)准确的计算task的负载。如果支持fast_switch的功能,可以在中断上下文直接进行调频。

cpufreq driver:负责平台相关的调频调压机制的实现,基于cpu subsystem driver、OPP、clock driver、regulator driver等模块,提供对CPU频率和电压的控制。

cpufreq stats:负责调频信息和各频点运行时间等统计,提供每个cpu的cpufreq有关的统计信息。

3.数据结构

struct cpufreq_policy:linux使用cpufreq policy来抽象cpu设备的调频调压功能,用于描述不同的policy,包含频率表、cpuinfo等各种信息,并且每个policy都会对应某个具体的governor。

struct cpufreq_governor:不同policy的管理策略,根据使用场景的不同,会有不同的调频调压策略。

struct cpufreq_driver:用于描述cpufreq的驱动,是驱动工程师最关注的结构。

f87a849e-bc22-11ed-bfe3-dac502259ad0.png

4.初始化及工作流程

4.1初始化流程

cpufreq_register_driver函数为cpufreqdriver注册的入口,驱动程序通过调用该函数进行初始化,并传入相关的struct cpufreq_driver,cpufreq_register_driver会调用subsys_interface_register,最终执行回调函数cpufreq_add_dev。

系统中可以同时存在多个governor,policy通过cpufreq_policy->governor指针和某个governor相关联。要想一个governor能够被使用,首先要把该governor注册到cpufreq framework中。

cpufreq core定义了一个全局链表变量:cpufreq_governor_list,注册函数首先根据governor的名称,通过__find_governor()函数查找该governor是否已经被注册过,如果没有被注册过,则把代表该governor的结构体添加到cpufreq_governor_list链表中。

fa3469a8-bc22-11ed-bfe3-dac502259ad0.png

4.2工作流程

不同的governor的触发调频调压流程不一样,这里以scheduutil governor为例。

CFS负载变化的时候或者RT、DL任务状态更新的时候,就会启动调频这几个scheduler类会调用cpufreq_update_util函数(前面注册进来的hook函数)触发schedutil工作。每个cpu最终会回调到sugov_upate_shared或者sugov_upate_single函数中的一个。

由于是从scheduler里直接调用下来的,最终执行调频切换时,无论是快速路径触发的简单写寄存器,还是慢速路径触发的kthread都不会占用过多时间或者调度开销。

具体的触发时机如下:

fae67cd8-bc22-11ed-bfe3-dac502259ad0.png





审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 寄存器
    +关注

    关注

    31

    文章

    5281

    浏览量

    119746
  • CMOS电路
    +关注

    关注

    0

    文章

    49

    浏览量

    11489
  • LINUX内核
    +关注

    关注

    1

    文章

    316

    浏览量

    21596
  • CFS
    CFS
    +关注

    关注

    0

    文章

    7

    浏览量

    9044

原文标题:一文搞懂linux cpu dvfs

文章出处:【微信号:IC学习,微信公众号:IC学习】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    嵌入式Linux系统CPU控制常见办法测试

    01 测试环境 Xilinx ZCU106 单板 Xilinx VCU TRD2020.1 02 介绍 嵌入式Linux系统中,Linux直接管理所有CPU。默认情况下,系统的目标是提
    的头像 发表于 11-26 14:17 5057次阅读

    Linux驱动开发之IO模型介绍

    Linux驱动开发中,应用程序通过循环读取或者中断的方式都会使得CPU的占用率很高。本文介绍五种IO模型,可以用来优化文件读写方式,降低CPU的使用率。
    发表于 07-29 09:03 796次阅读

    关于DVFS与AVS

    请问工程师,在SmartReflex中的DVFS与AVS两种方式的区别是什么,谢谢
    发表于 06-21 03:32

    请问是否有其他文档详细的描述Omap-l132芯片的DVFS使用方法?

    正在使用Omap-l132芯片,想要使用DVFS做省电。文档《spruh78.pdf》和《omap-l132,pdf》中相关内容较少且较概略,请问是否有其他文档详细的描述此芯片的DVFS使用方法?
    发表于 08-23 07:54

    基于RK3399的Linux kernel中CPU时钟管理介绍

    1、基于RK3399的Linux kernel中CPU时钟管理介绍绝大多数的电子器件都是由时钟驱动其工作的。而SoC芯片或电路板中的时钟以树状结构呈现,按时钟域进行划分,按照不同的时钟需求
    发表于 06-21 16:00

    RK3288 Android6.0 DVFS与DDR frequnecy的初始化

    Platform: RK3288OS: Android 6.0Kernel: 3.10.92DVFS即Dynamic Voltage and Frequency Scaling.有看到RK将DDR
    发表于 11-07 17:28

    ATMEL的CPU介绍

    ATMEL的CPU介绍ATMEL的CPU介绍ATMEL的CPU介绍ATMEL的
    发表于 10-30 18:08 5次下载

    Linux那些事儿linux的入门介绍

    电子发烧友网站提供《Linux那些事儿linux的入门介绍.pdf》资料免费下载
    发表于 05-02 08:00 4次下载

    DVFS对程序性能影响模型

    (dynamic voltage frequency scaling,简称DVFS)来提升单节点的能耗表现.但是,DVFS这一类机制同时影响到应用的能源消耗和性能,而这一问题尚未被深入探索.专注于 DVFS 机制对应用程序性能的
    发表于 12-30 14:56 1次下载

    Linux CPU的性能应该如何优化

    Linux系统中,由于成本的限制,往往会存在资源上的不足,例如 CPU、内存、网络、IO 性能。本文,就对 Linux 进程和 CPU 的原理进行分析,总结出
    的头像 发表于 01-18 08:52 3314次阅读

    如何分析Linux CPU上下文切换问题

    在我的上一篇文章:《探讨 Linux CPU 的上下文切换》中,我谈到了 CPU 上下文切换的工作原理。快速回顾一下,CPU 上下文切换是保证 Li
    的头像 发表于 05-05 20:11 1886次阅读

    一文搞懂linux cpu dvfs

    CPU dvfs(dynamic voltage frequency scaling)子系统负责cpu运行时,对其频率及电压进行调整,以求性能满足的前提下,cpu的功耗尽可能低。
    的头像 发表于 03-07 11:35 1836次阅读
    一文搞懂<b class='flag-5'>linux</b> <b class='flag-5'>cpu</b> <b class='flag-5'>dvfs</b>

    如何在Linux中对CPU进行压力测试

    Linux环境中对CPU进行压力测试,主要是为了测试系统的CPU负载能力和稳定性,可以使用多种工具和命令来进行测试。本文主要介绍两种常用的CPU
    发表于 07-18 09:55 7222次阅读

    Linux服务器CPU飙升的原因

    首先在Linux系统中检查CPU使用率。可以通过在命令行中输入top或htop命令来查看当前系统中各个进程的CPU使用率。如果CPU使用率大于80%,则可以考虑进行排查。
    发表于 02-28 11:00 1321次阅读
    <b class='flag-5'>Linux</b>服务器<b class='flag-5'>CPU</b>飙升的原因

    浅析SoC芯片的DVFS技术

    DVFS(Dynamic Voltage and Frequency Scaling)即动态电压频率调节技术,是一种高效的低功耗技术,它通过动态调整工作电压和时钟频率,以达到降低功耗的目的。
    的头像 发表于 04-05 09:52 2426次阅读
    浅析SoC芯片的<b class='flag-5'>DVFS</b>技术