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。
tz_handler接收到DEVFREQ_GOV_START事件后回调至tz_get_target_freq,tz_get_target_freq是整个GPU调频中的重要函数,决定着后续设置的目标频率。
在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。
在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 为何丢失
长按关注内核工匠微信
Linux内核黑科技| 技术文章| 精选教程