基于devfreq framework的GPU调频

AI时代已经来临,在日益增长的算力需求下,GPU已经成为AI世界不可或缺的工具,而移动端高渲染高帧应用也对移动端GPU提出越来越高的要求,本文将以高通的adreno gpu为例对GPU的调频进行介绍。

在介绍之前,建议先阅读本文章《Linux devfreq framework剖析》,了解devfreq framework子系统中devfreq device的作用和governor的统一实现格式。GPU调频基于devfreq framework创建GPU对应的devfreq device(kgsl)以及governor(msm-adreno-tz),基本流程与devfreq framework流程一致。

a.初始化governor并通过devfreq_add_governor注册到framework,初始化devfreq device并通过devfreq_add_device注册到framework并将device与governor进行匹配;

b.当governor的event_handler收到对应的事件,则回调governor中实现的get_target_freq获取governor计算出的目标频率返回给framework;

c.framework将回调devfreq device中实现的devfreq->profile->target()设置目标频率。

接下来就是介绍GPU对应的devfreq device以及governor。

1.msm-adreno-tz

根据以上介绍,governor的重要作用就是接收事件并且计算出devfreq device所需要设置的目标频率,因此在governor中要实现两个重要函数event_handler以及get_target_freq。    

83b6794a47ca684a94e8cccb68e30eb0.png

c642235a3698750dab9d0466e81369da.png

73abf0d8cf69293f1e96324cb078d0a3.png

tz_handler接收到DEVFREQ_GOV_START事件后回调至tz_get_target_freq,tz_get_target_freq是整个GPU调频中的重要函数,决定着后续设置的目标频率。    

85175f09d5360ba9423132f0423da0eb.png

在tz_get_target_freq中首先通过devfreq_update_stats获取当前gpu的频率并且通过devfreq_get_freq_level获取当前频率所映射的freq_level,然后根据compute_work_load获取到的当前gpu的负载通过__secure_tz_update_entry3计算目标freq_level,最终将目标freq_level重新映射成freq,这就是目标频率。

2.kgsl

根据以上介绍,devfreq device的重要作用就是设置目标频率,因此device实现的回调就是devfreq->profile->target(),也就是kgsl_devfreq_target。

c90bb54c68c6bacf21a7a3581cc3f775.png

7b12d92acb5a857f949ed98ee478e44b.png    

26980653e4902edfbac29e8fd9355c88.png

       在kgsl_devfreq_target中首先判定计算出的目标频率是否满足更新当前的gpu频率的要求,然后通过kgsl_pwrctrl_pwrlevel_change函数使用_isense_clk_set_rate设置目标频率。

Tips:

以上所述GPU freq与GPU freq_level的freq_table可通过用户空间节点查看

/sys/class/kgsl/kgsl-3d0/freq_table_mhz

参考资料

1.内核工匠《Linux devfreq framework剖析》

2.https://android.googlesource.com/kernel/msm

综述

本文介绍基于devfreq framework的GPU调频,以GPU调频为例更具体地理解devfreq framework的各模块的作用,为后续devfreq device的开发打下基础。更好地理解GPU调频也可以有助于移动端性能功耗问题的解决,解决思路可以不仅仅局限在cpu调频调度,也将着眼于memory调频和GPU调频以及三者的联动调频。希望本文对大家的工作学习有所帮助,如有错误,欢迎纠正。    

Android分区挂载原理介绍(上)

Android分区挂载原理介绍(下)

Perfetto数据流架构故障分析:带你研究 trace 为何丢失

782fc93e088152d5a0ca7ecd9e4500a8.gif

长按关注内核工匠微信

Linux内核黑科技| 技术文章| 精选教程

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/422192.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2024年腾讯云新用户和老用户优惠代金券免费领取,共14张代金券

腾讯云代金券领取渠道有哪些?腾讯云官网可以领取、官方媒体账号可以领取代金券、完成任务可以领取代金券,大家也可以在腾讯云百科蹲守代金券,因为腾讯云代金券领取渠道比较分散,腾讯云百科txybk.com专注汇总优惠代金券领取页面&am…

电子科技大学《数据库原理及应用》(持续更新)

前言 电子科技大学的数据库课程缩减了部分的课时,因此,可能并不适合所有要学习数据库的宝子们,但是,本人尽量将所有数据库的内容写出来。本文章适用于本科生的期中和期末的复习,电子科技大学的考生请在复习前先看必读…

鸿蒙Harmony应用开发—ArkTS声明式开发(通用属性:位置设置)

设置组件的对齐方式、布局方向和显示位置。 说明: 从API Version 7开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 align align(value: Alignment) 设置容器元素绘制区域内的子元素的对齐方式。 卡片能力: 从API…

代码随想录第二十五天 78.子集 90.子集II 491.非递减子序列

LeetCode 78 子集 题目描述 给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。 解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。 示例 1: 输入:nums [1,2,3] 输出&…

【Spring】spring中怎么解决循环依赖的问题

🍎个人博客:个人主页 🏆个人专栏:Spring ⛳️ 功不唐捐,玉汝于成 目录 前言 正文 解决步骤 考虑 结语 我的其他博客 前言 在软件开发中,依赖注入是一种常见的设计模式,它可以帮助我们管…

SQL Server 开发环境配置教程(SSMS+SQL Prompt)

背景 记录一下 SQL Server 常用开发软件 体验了各种数据库IDE(DBeaver、Navicat、DataGrip)之后综合下来还是感觉 SSMSSQL Prompt 对于 SQL Server 最好用,所以在此记录一下配置过程 数据库可视化管理工具SSMS 官方下载地址: https://learn.microsoft…

设计模式-结构模式-装饰模式

装饰模式(Decorator Pattern):动态地给一个对象增加一些额外的职责,就增加对象功能来说,装饰模式比生成子类实现更为灵活。装饰模式是一种对象结构型模式。 //首先,定义一个组件接口: public in…

简单求和计算器

其实对于计算器的写法在C语言阶段就已经有了,但是,在目前阶段《前后端交互》,这算是一种全新的写法,毕竟将数据从前端返回给后端,然后再将数据返回给前端,都涉及到一些参数的交互,值得我们学习深…

qt5-入门-使用拖动方式创建Dialog

参考: C GUI Programming with Qt 4, Second Edition 本地环境: win10专业版,64位,Qt5.12 目录 实现效果基本流程逐步实操1)创建和初始化子部件2)把子部件放进布局中3)设置tab顺序4&#xff09…

LeetCode:2368. 受限条件下可到达节点的数目(dfs Java)

目录 2368. 受限条件下可到达节点的数目 题目描述: 实现代码与解析: DFS 原理思路: 2368. 受限条件下可到达节点的数目 题目描述: 现有一棵由 n 个节点组成的无向树,节点编号从 0 到 n - 1 ,共有 n - …

【python】python懂车帝数据可视化(代码+报告)

👉博__主👈:米码收割机 👉技__能👈:C/Python语言 👉公众号👈:测试开发自动化【获取源码商业合作】 👉荣__誉👈:阿里云博客专家博主、5…

select,poll和epoll有什么区别

它们都是NIO中多路复用的三种实现机制,是由linux操作系统提供的。 用户空间和内核空间:操作系统为了保证系统安全,将内核分为两个部分,一个是用户空间,一个是内核空间。用户空间不能直接访问底层的硬件设备&#xff0…

qt 5.15版本安装

1.qt5.15版本安装 2.安装慢时,切换到清华镜像源:.\qt-unified-windows-x64-online.exe --mirror https://mirrors.tuna.tsinghua.edu.cn/qt/ 3.没有qt 5.15版本在旁边进行筛选,只选archive

【多线程】CAS详解

目录 🌴什么是 CAS🌸CAS 伪代码 🎍CAS 是怎么实现的🍀CAS 有哪些应⽤🌸实现原子类🌸实现自旋锁 🌳CAS 的 ABA 问题🌸**什么是 ABA 问题**?🌸ABA 问题引来的 B…

你心中的韩剧TOP1是哪一部

关注公众号:萌番bilfun,发送影片名称,即可获取资源链接 【2024最新韩剧来袭,准备好迎接心灵的震撼了吗?】 韩剧迷们,你们期待已久的2024最新韩剧终于来了!准备好迎接心灵的震撼了吗&#xff1f…

【嵌入式学习】网络编程day03.02

一、项目 1、TCP机械臂测试 #include <myhead.h> #define SER_IP "192.168.126.32" #define SER_PORT 8888 #define CER_IP "192.168.126.42" #define CER_PORT 9891 int main(int argc, const char *argv[]) {int wfd-1;//创建套接字if((wfdsocke…

【PyTorch】成功解决AttributeError: ‘Tuple‘ object has no attribute ‘cuda‘

【PyTorch】成功解决AttributeError: ‘Tuple‘ object has no attribute ‘cuda‘ &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程&…

Vue.js大师: 构建动态Web应用的全面指南

VUE ECMAScript介绍什么是ECMAScriptECMAScript 和 JavaScript 的关系ECMAScript 6 简介 ES6新特性let基本使用const不定参数箭头函数对象简写模块化导出导入a.jsb.jsmain.js Vue简介MVVM 模式的实现者——双向数据绑定模式 Vue环境搭建在页面引入vue的js文件即可。创建div元素…

分享Selenium测试工具用来模拟用户浏览器的操作

执行JS的类库&#xff1a;execjs&#xff0c;PyV8&#xff0c;selenium&#xff0c;node pip list pip install selenium pip install xlrd pip install xlwt pip install PyExecJS pip install xlutils selenium测试工具可以用来模拟用户浏览器的操作&#xff0c;其支持的浏览…

ssm172旅行社管理系统的设计与实现

** &#x1f345;点赞收藏关注 → 私信领取本源代码、数据库&#x1f345; 本人在Java毕业设计领域有多年的经验&#xff0c;陆续会更新更多优质的Java实战项目希望你能有所收获&#xff0c;少走一些弯路。&#x1f345;关注我不迷路&#x1f345;** 一 、设计说明 1.1 研究…