高通GPU频率动态调整机制

本文介绍了高通GPU采用Linux devfreq框架进行动态频率调整的原理,详细阐述了性能、节电、用户空间和按需这四种管理策略。重点讲解了高通自有的msm-adreno-tz governor的工作流程,以及如何通过接口手动调节GPU频率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

DVFS(Dynamic Voltage And Frequency Scaling)动态电压和频率调节,这里主要研究GPU频率动态的调节。

和CPU采用cpufreq框架动态调节频率类似,GPU这块采用了Linux devfreq框架。

Devfreq有四种对频率的管理策略governor:

1、  performance:GPU会固定工作在其支持的最高频率上,以追求最高性能。

2、  powersave:GPU会固定工作在其支持的最低频率上,以追求最低的功耗。

3、  userspace:早期的管理策略,系统将变频策略的决策交给了用户态应用程序,并提供相应的接口供其使用。

4、  ondemand:userspace 是用户态的检测,效率低,而 ondemand 则是一个完全在内核态下工作并且能够以更加细粒度的时间间隔对系统负载情况进行采样分析的  governor 。

Devfreq只提供了实现变频的框架,只是机制,而具体如何决定变频的策略则是各硬件厂商根据其硬件特性来决定的。

Qualcomm的GPU则使用的是他们自己的governor:msm-adreno-tz,他和ondemand有点相似,是在内核态根据GPU的负载来动态决定如何变频的。


我们来看一下他们的实现机制。

首先在初始化的过程中,msm-adreno-tz先调用devfreq_add_governor(),向devfreq框架中添加一

### 高通 CPU Thermal 限频解决方案 #### 背景分析 当设备运行过程中,CPU 温度过高可能引发热保护机制启动,从而导致性能下降。具体表现为系统通过降低 CPU 和 GPU 的工作频率来减少热量产生[^1]。这种行为通常由 thermal-engine 或者内核中的 Thermal Core 控制。 在高通平台中,thermal 管理的核心逻辑依赖于硬件传感器和软件框架之间的协作。如果温度达到预设阈值(例如 trip_point_0_temp),则会触发相应的动作集,比如降频或关闭核心[^2]。 --- #### 解决方案概述 以下是针对高通 CPU 因 thermal 导致的限频问题的一些常见解决策略: 1. **调整 Threshold 值** 可以修改 `trip_point_0_temp` 的初始设定值以及恢复条件。例如,在某些场景下可以将触发点设置得更高一些(如从 85°C 提升至 95°C)。同时,为了防止频繁波动,可以在降温后延迟一段时间再重置 threshold 至较低水平(如回到 85°C)。 2. **优化 Cooling Actions** 减少不必要的 cooling action 是缓解 thermal limit 的有效手段之一。可以通过以下方式实现: - 动态调节冷却措施优先级; - 对不同类型的负载分配不同的资源管理策略; - 使用更精细粒度的频率步进而非粗暴地大幅度削减时钟速率。 3. **增强散热设计** 改善物理层面的散热能力也是根本性的办法。这涉及增加导热材料覆盖面积、改进机壳通风结构等方面的工作。此外还可以考虑引入主动式风扇辅助降温技术(尽管这对移动终端来说较少见)。 4. **升级 Kernel Version & Patching** 自 Linux kernel version 4.9 后,KTM 已经被废弃并替换成了更加灵活通用的新架构-Thermal Core 。因此建议尽可能迁移到最新稳定版kernel以便利用其带来的功能改进与错误修复成果。 5. **自定义 Thermal Policy** OEM厂商可以根据实际产品需求定制专属policy文件, 这样不仅能够满足特定应用场景下的特殊要求而且还能提升用户体验满意度. --- #### 实现细节举例 下面给出一段简单的伪代码用于演示如何动态更改threshold参数: ```c #include <linux/thermal.h> void adjust_trip_points(struct thermal_zone_device *tzd){ int ret; /* Set new high temp */ ret = tzd->ops->set_trips(tzd , THERMAL_TRIP_HOT , 95); if(ret != SUCCESS){ printk(KERN_ERR "Failed to set hot trip point\n"); } /* Reset low temp after cooldown period */ msleep(60*1000); // Wait one minute before resetting ret = tzd->ops->set_trips(tzd , THERMAL_TRIP_WARM , 85); if(ret != SUCCESS){ printk(KERN_ERR "Failed to reset warm trip point\n"); } } ``` 上述函数展示了怎样编程接口去改变指定thermal zone device对象上的临界温度数值。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值