高通平台GPU动态调频DCVS . 篇3 . 一个无法调频问题的解决过程

adreno源码系列(五)打开kgsl // 接"adreno源码系列(二)kgsl driver"中第3.3节 static int kgsl_open_device(struct kgsl_device *device) { int result = 0; mutex_lock(&device->mutex); // kgsl_device->open_count记录/dev/kgsl-3d0被open的次数 if (device->open_count == 0) { // 如果是第一次打开, 则调用adre 阅读详情
AI摘要

本文深入探讨了高通平台GPU动态调频DCVS机制中,GPU频率无法调节至预期值的复杂问题。揭示了default_pwrlevel配置不当导致频率锁定在特定值的原因,并提出了有效的解决方案。


系列文章
高通平台GPU动态调频DCVS . 篇1 . Interface
高通平台GPU动态调频DCVS . 篇2 . Framework & Procedure
高通平台GPU动态调频DCVS . 篇3 . 一个无法调频问题的解决过程


之所以会相对系统地总结GPU DCVS,是因为前段时间遇到一个GPU频率一直无法调节的问题

1. 问题现象

从 /sys/class/kgsl/kgsl-3d0/clock-mhz 获取GPU频率,结果一直维持在624MHz,该芯片的最高频率
无论做场景切换还是轻重载都是624MHz

2. 初步分析

无论是CPU还是GPU一般出现频率固定无法调频的时候,可能性有

  • governor设置成了userspace, performance这些非动态调节的governor
  • 频率被锁了,一些场景识别出了问题,或者是锁频了没有成功退出
  • 后台异常,负载一直过高,这种可能性比较小,因为一旦出现了就会很卡了
  • 调频阈值过于激进,只要有负载就满频跑
  • governor 自身bug
  • 调频驱动bug

接下来就是排除法

(1) 确认governor

设备节点 /sys/class/kgsl/kgsl-3d0/devfreq/governor, 结果是msm-adreno-tz,是高通默认的gpu dcvs governor没有问题

(2) 确认是否锁频导致
  • /sys/class/kgsl/kgsl-3d0/ 下相应的min, max 都没有设置
  • 添加日志信息,确认governor /drivers/devfreq/governor_msm_adreno_tz.c 以及 kgsl_pwrkgsl.c 都没有锁最低频率的设置
    而且governor出来的值,就是624MHz
(3) 确认负载

从 /sys/class/kgsl/kgsl-3d0/gpu_busy_percentage 结果看,负载都很低0-10之间


看到这里,这个问题已经不是普通的频率无法调节问题,可能是平台设定维持最高频率或者是异常导致

这时在kgsl的接口目录/sys/class/kgsl/kgsl-3d0中,看到一个名为default_pwrlevel的节点

(4) 尝试 default_pwrlevel
xxx:/sys/class/kgsl/kgsl-3d0 # cat default_pwrlevel                                                                                                                                    
1
xxx:/sys/class/kgsl/kgsl-3d0 # cat freq_table_mhz                                                                                                                                      
624 624 560 510 401 315 214 133 

default_pwrlevel 值是1,对应freq table中的频率是624MHz,同样高通平台其他的设备,default_pwrlevel 对应的是频率最低值

而修改default_pwrlevel 值为7之后,频率可调, 或者设置为6,频率可调,没有负载会恢复到level 6

3. 深入分析

这个问题到这里至少已经有方案了,调整default_pwrlevel

(1) default_pwrlevel

底层的 default_pwrlevel 配置在 dts中

kernel/drivers/gpu/msm/adreno.c

static void adreno_of_get_initial_pwrlevel(struct adreno_device *adreno_dev,
        struct device_node *node)
{
    struct kgsl_device *device = KGSL_DEVICE(adreno_dev);
    struct kgsl_pwrctrl *pwr = &device->pwrctrl;
    int init_level = 1;

    of_property_read_u32(node, "qcom,initial-pwrlevel", &init_level);

    if (init_level < 0 || init_level > pwr->num_pwrlevels)
        init_level = 1;

    pwr->active_pwrlevel = init_level;
    pwr->default_pwrlevel = init_level;
}

arch/arm64/boot/dts/xpeng/xxx.dtsi

/* GPU overrides for auto */
&msm_gpu {
    qcom,gpu-pwrlevel-bins {
        qcom,gpu-pwrlevels-0 {
            qcom,initial-pwrlevel = <1>;
        };

        qcom,gpu-pwrlevels-2 {
            qcom,initial-pwrlevel = <2>;

        };

    };
};

default_pwrlevel 如何影响频率
从default_pwrlevel的调用栈看,kgsl_pwrctrl_enable 是最终apply default_pwrlevel的地方

static int kgsl_pwrctrl_enable(struct kgsl_device *device)
{
    struct kgsl_pwrctrl *pwr = &device->pwrctrl;
    int level, status;

    if (pwr->wakeup_maxpwrlevel) {
        level = pwr->max_pwrlevel;
        pwr->wakeup_maxpwrlevel = 0;
    } else if (kgsl_popp_check(device)) {
        level = pwr->active_pwrlevel;
    } else {
        level = pwr->default_pwrlevel; 
    }

    kgsl_pwrctrl_pwrlevel_change(device, level);

    /* Order pwrrail/clk sequence based upon platform */
    status = kgsl_pwrctrl_pwrrail(device, KGSL_PWRFLAGS_ON);
    if (status)
        return status;
    kgsl_pwrctrl_clk(device, KGSL_PWRFLAGS_ON, KGSL_STATE_ACTIVE);
    kgsl_pwrctrl_axi(device, KGSL_PWRFLAGS_ON);

    dump_stack();
    return device->ftbl->regulator_enable(device);
}

当GPU 进入slumber状态时, 调用kgsl_pwrctrl_enable, 代码会走到第12行,level值就是default level,这样下次重新唤醒工作的时候,频率就是default_pwrlevel对应的频率了
高的default_pwrlevel 理论上对性能更好,在GPU遇到高负载时,不需要一级级把频率升上去,而是直接最高频率,如果负载不高,后续也可以降下来
如何调用看dumpstack

<6>[   42.925409] [<ffffff800808862c>] dump_backtrace+0x0/0x1c0
<6>[   42.925420] [<ffffff8008088800>] show_stack+0x14/0x1c
<6>[   42.925433] [<ffffff8008327cbc>] dump_stack+0x94/0xb4
<6>[   42.925445] [<ffffff8008575538>] kgsl_pwrctrl_enable+0xbc/0xdc
<6>[   42.925454] [<ffffff8008575ab4>] kgsl_pwrctrl_change_state+0x1e0/0x420
<6>[   42.925465] [<ffffff800859e3fc>] adreno_start+0xe0/0x370
<6>[   42.925473] [<ffffff800857576c>] _wake+0xb4/0x21c
<6>[   42.925480] [<ffffff8008575924>] kgsl_pwrctrl_change_state+0x50/0x420
<6>[   42.925488] [<ffffff8008575eac>] kgsl_active_count_get+0x8c/0x148
<6>[   42.925500] [<ffffff8008585638>] sendcmd+0x98/0x498
<6>[   42.925509] [<ffffff80085868dc>] _adreno_dispatcher_issuecmds.part.13+0x350/0x548
<6>[   42.925517] [<ffffff8008587964>] adreno_dispatcher_work+0x5e8/0x7a4
<6>[   42.925528] [<ffffff80080bb25c>] kthread_worker_fn+0xb0/0x12c
<6>[   42.925536] [<ffffff80080bb1a4>] kthread+0xdc/0xe4
<6>[   42.925545] [<ffffff8008082f50>] ret_from_fork+0x10/0x40
<3>[   42.926576] ====== _wake  2636  
<3>[   43.010218] ====== kgsl_pwrctrl_enable  2531  
<6>[   43.010368] CPU: 0 PID: 364 Comm: kworker/u8:4 Not tainted 4.4.178-perf+ #57
<6>[   43.010376] Hardware name: Qualcomm Technologies, Inc. APQ 8096pro V1.1 AUTO ADP (DT)
<6>[   43.010396] Workqueue: kgsl-workqueue kgsl_idle_check
<6>[   43.010406] Call trace:
<6>[   43.010422] [<ffffff800808862c>] dump_backtrace+0x0/0x1c0
<6>[   43.010432] [<ffffff8008088800>] show_stack+0x14/0x1c
<6>[   43.010447] [<ffffff8008327cbc>] dump_stack+0x94/0xb4
<6>[   43.010455] [<ffffff8008575538>] kgsl_pwrctrl_enable+0xbc/0xdc
<6>[   43.010464] [<ffffff80085755fc>] _slumber+0xa4/0x160
<6>[   43.010472] [<ffffff8008575b88>] kgsl_pwrctrl_change_state+0x2b4/0x420
<6>[   43.010481] [<ffffff8008575d88>] kgsl_idle_check+0x94/0x12c
<6>[   43.010491] [<ffffff80080b600c>] process_one_work+0x264/0x3fc
<6>[   43.010499] [<ffffff80080b69fc>] worker_thread+0x310/0x424
<6>[   43.010510] [<ffffff80080bb1a4>] kthread+0xdc/0xe4
<6>[   43.010519] [<ffffff8008082f50>] ret_from_fork+0x10/0x40
(2) Root cause

调整default_pwrlevel 只是在表面上解决了问题,疑问是 default_pwrlevel 只是影响GPU从空载休眠状态到工作状态的初始频率,不应该存在default_pwrlevel 是频率时就可以调频,高频率不可以调频的场景,还需要继续查
从default_pwlevel设定来看,设置为0-1时候(即频率是624MHz时,这个平台默认最高的两个频率都是624MHz),频率就不可调,设置为2-7时,可以动态调节,所以应该是驱动什么地方对这个最高频率做了手脚导致
在msm-adreno-tz governor 的计算频率方法里加日志 tz_get_target_freq()

static int tz_get_target_freq(struct devfreq *devfreq, unsigned long *freq,
        u32 *flag)
{
 int result = 0;
 struct devfreq_msm_adreno_tz_data *priv = devfreq->data;
 struct devfreq_dev_status stats;
 int val, level = 0;
 unsigned int scm_data[4];
 int context_count = 0;

 /* keeps stats.private_data == NULL */
 result = devfreq->profile->get_dev_status(devfreq->dev.parent, &stats);
 if (result) {
  pr_err(TAG "get_status failed %d\n", result);
  return result;
 }

 *freq = stats.current_frequency;
 priv->bin.total_time += stats.total_time;
 priv->bin.busy_time += stats.busy_time;

 if (stats.private_data)
  context_count = *((int *)stats.private_data);

 /* Update the GPU load statistics */
 compute_work_load(&stats, priv, devfreq);
 /*
  * Do not waste CPU cycles running this algorithm if
  * the GPU just started, or if less than FLOOR time
  * has passed since the last run or the gpu hasn't been
  * busier than MIN_BUSY.
  */
 if ((stats.total_time == 0) ||
  (priv->bin.total_time < FLOOR) ||
  (unsigned int) priv->bin.busy_time < MIN_BUSY) {
  return 0;
 }

 level = devfreq_get_freq_level(devfreq, stats.current_frequency);
 if (level < 0) {
  pr_err(TAG "bad freq %ld\n", stats.current_frequency);
  return level;
 }
 /* Fix GPUFreq can not be scaled from 624MHz, for 820A, by xiaopeng */
 if (level == 0 && devfreq->profile->freq_table[0] ==
      devfreq->profile->freq_table[1]) {
  level = 1;
 }

 /*
  * If there is an extended block of busy processing,
  * increase frequency. Otherwise run the normal algorithm.
  */
 if (!priv->disable_busy_time_burst &&
   priv->bin.busy_time > CEILING) {
  val = -1 * level;
 } else {

  scm_data[0] = level;
  scm_data[1] = priv->bin.total_time;
  scm_data[2] = priv->bin.busy_time;
  scm_data[3] = context_count;
  __secure_tz_update_entry3(scm_data, sizeof(scm_data),
     &val, sizeof(val), priv);
 }
 priv->bin.total_time = 0;
 priv->bin.busy_time = 0;

 /*
  * If the decision is to move to a different level, make sure the GPU
  * frequency changes.
  */
 if (val) {
  level += val;
  level = max(level, 0);
  level = min_t(int, level, devfreq->profile->max_state - 1);
 }

 *freq = devfreq->profile->freq_table[level];
 return 0;
}

这个函数首先获取当前的gpufreq, 以及busy_time 等信息,然后把gpufreq查表转成pwrlevel,再通过tz来计算目标pwrlevel,是要在当前的level上加1还是减1,进而设定目标频率
通过加log就发现问题原因了

  • 第39行,频率是624MHz的时候,这里的level从查表得到的值就是0 ({624, 624, 560, 510, 401, 315, 214, 133 })
  • 后面就计算目标频率是加还是减 val值,发现val 值是1, 也就是level 要加1了,频率降了一个挡位
  • 那目标频率的level就是 0 + 1 = 1, 这个1对应的频率是多少呢,624MHz
  • 死循环,下次进入tz_get_target_freq , 又把624MHz算成了level 0, 结果目标level就在0-1之间死循环,频率都是624

4. Solution

问题是由于 level 0 - 1 两个档位对应的频率相同,进而governor的目标频率陷入死循环导致。
处理方法有下面几种,都可以达到目的,第三种看起来更健壮一点,如果只为解决问题,第一第二种都可以

  • 在dts中去掉重复的频率
  • 在tz_get_target_freq 的freq转level时加处理,如果是0-1 对应的频率一样,就忽略掉0,level 直接等于1
  • 在记录cur_freq时,也记录下cur_level,避免把level 1的624 下次算成level 0
Android功耗系列专题理论之四:GPU功耗问题分析方法 本文详细解析了高通平台GPU的调试与管理架构,重点介绍了Adreno GPU的动态调频机制和功耗优化策略。文章首先阐述了高通GPU管理架构的核心组件KGSL,包括其动态时钟电压调节(DCVS)、电源状态管理和总线带宽控制机制。随后详细讲解了调试工具的使用方法,如Ftrace事件追踪、Sysfs接口和性能计数器分析。文章还深入剖析了GPU时钟与总线带宽的协同控制机制、DEVFREQ框架实现原理,以及msm-adreno-tz调速器的工作流程。最后提供了GPU资源监控节点和常见问题排查方法,为开发者提供了全面的 阅读详情

相关推荐

自研SSD固件:从零实现固态硬盘底层存储控制系统

本文探讨了自主开发SSD固件的可行性及实现方案。分析表明,虽然NAND Flash控制协议标准化且存在开源参考实现,但开发仍面临FTL设计复杂度高、性能调优等挑战。推荐采用FPGA平台(如Xilinx Zynq-7000)搭配SLC NAND Flash的方案,预计开发周期9-12个月。系统采用分层架构设计,包含主机接口层、FTL层和闪存接口层,核心模块需实现NAND Flash底层驱动、地址映射管理和垃圾回收等功能。文中提供了关键数据结构和基础驱动代码示例,包括页读写、块擦除等操作。该方案着重解决NAND

电脑管家 1879

高通平台GPU动态调频DCVS . 篇2 . Framework & Procedure

1. 高通平台 GPU DCVS架构 GPU DCVS是基于Linux Devfreq来实现 高通的kgsl(kernel-graphics-support-layer)作为devfreq device msm-adreno-tz 作为devfreq governor 简单的架构如下 如上图所示 首先 KGSL 作为device,msm-adreno-tz 作为governor注册到dev...

Schedule Plus 8748

瑞萨RA6M5驱动ST7735屏幕避坑指南:从软件SPI到显示汉字与图形的完整流程

本文详细介绍了瑞萨RA6M5单片机驱动ST7735屏幕的完整流程,涵盖硬件连接、软件SPI控制、汉字显示及图形绘制优化等关键步骤。通过避坑指南和实用代码示例,帮助开发者解决屏幕初始化、时序控制、字库移植等常见问题,实现高效稳定的显示效果。

weixin_28705087的博客 275

GPU&CPU频率和工作模式的获取设置

今天给大家带来最近工作中用到的关于gpu&amp;cpu信息获取的节点的读取。 1gpu信息获取   1.1 高通gpu说明       高通设备CPU采用cpufreq框架动态调节频率,相似的GPU这块采用了Linux devfreq框架进行调节。Devfreq有四种对频率的管理策略governor(框架规定,实际实现各厂商不同): 1、  performance:GPU会固定工作在...

lidongxiu0714 2万+

Windows下用Python调用科大讯飞语音唤醒SDK的避坑指南(附完整代码)

本文详细介绍了在Windows平台使用Python调用科大讯飞语音唤醒SDK的全流程,包括环境配置、核心代码实现、典型问题解决方案及进阶开发技巧。通过完整的代码示例和避坑指南,帮助开发者快速集成语音唤醒功能,提升开发效率。

u0v1w2x3的博客 405

MobaXterm结合SSH密钥对安全连接阿里云ECS的实战教程

本文详细介绍了如何使用MobaXterm结合SSH密钥对安全连接阿里云ECS的实战教程。通过对比传统密码登录的风险,重点讲解了密钥对的生成与配置、阿里云控制台的密钥绑定技巧,以及MobaXterm的高级设置和故障排查方法,帮助用户实现高效、安全的远程连接。

weixin_29208327的博客 465

高通gpu信息获取

查看高通的gpu 和cpu的实时状态,高通的Snapdragon Profiler 工具是个不错的选择,可以实时查看相关的信息。也可以通过命令查看。 在/sys/class/kgsl/kgsl-3d0 目录下可以看到高通gpu的信息 里面的信息太多,很多节也不知道代表啥意思,在power文件下如下: autosuspend_delay_ms runtime_active_time run...

兔兔里个花兔的博客 7326

Oracle EBS R12.2.X JSP部署、编译和配置相关操作。

系统环境 RDBMS : 12.1.0.2.0 Oracle Applications : 12.2.6 背景 在某项目上,需要开发JSP相关程序,比如单点登陆、打印二维条码。当前把JSP部署编译以后,访问提示错误:Requested resource or page is not allowed in this site, 通过查SR发现Oracle EBS R12.2.X版本对客制化JSP进行权限控限,需要设置某些配置文件。 实例操作步骤 上传JSP文件 通常上传到$OA_HTML目录或其子目

陈显平的专栏-Oracle EBS 1910

高通平台GPU动态调频DCVS . 篇1 . Interface

高通平台的GPU内核驱动架构趋于稳定,代码和接口都具备通用性,故分析整理出来以供快速参考 高通平台GPU内核驱动框架全称是 Kernel-Graphics-Support-Layer KGSL 1. KGSL kernel interface kgsl驱动所暴露出来的GPU相关常规控制接口位于 /sys/class/kgsl/kgsl-3d0 路径下 /sys/class/kgsl/kgsl-3d...

Schedule Plus 1万+

Open Dynamics Engine(ODE)物理引擎基础教程(I)——特点介绍

下一教程 Open Dynamics Engine(ODE)物理引擎基础教程(II)——相关概念 (在这一教程中将学习刚体、关节、碰撞的概念在ODE中的特点) 本文结构引言介绍特点使用ODE总结 引言 本文翻译自ODE官方教程英文版,有些地方增加了自己的理解。这一节介绍ODE的相关概念。 基础教程英文原版链接【http://ode.org/wiki/index.php?title=Manua...

腿足机器人领域 1676

数据服务:数据服务框架Magic-API 介绍及实践

接口快速开发框架 基于Java的接口快速开发框架,编写接口将通过magic-api提供的UI界面完成,自动映射为HTTP接口,无需定义Controller、Service、Dao、Mapper、XML、VO等Java对象即可完成常见的HTTP API接口开发 。在线页面快速开发平台 基于 vue 的在线页面快速开发平台,主要把所有的 vue 代码都改为在线配置,最终获得一个 json 格式的页面新一代爬虫平台 基于Java实现的新一代爬虫平台,以图形化方式定义爬虫流程,不写代码即可完成爬虫。今天给大家安利一

GIS摆渡人 2063

Devfreq Bus Dcvs

一、引言计算机的世界里,CPU任务分为CPU bound和IO bound。而实际场景下往往是两者混合型任务。针对性能的优化,普遍关注点都在CPU上(不论是CPU的频点和CPU的选核), ...

内核工匠 6358

MicroCap声学仿真介绍(三)-人耳的频率响应

这里需要注意的是,24mm我们会填为”24m”,这里的“m”是毫的意思,24m意思是24e-3,同理7.4mm我们可以填为7.4m,意思是7.4e-3。MicroCap声学库中,已内置“声源”模块和“管”模块,我们需要调用这两个模块,并用连接线将这两个模块连接到一起,完成仿真工作。上图中第一个图是在管的一端输入1Pa(94dBSPL)的信号,管的另一端的不同频率的声压大小的仿真结果。上述的结果跟我们的常识也是符合的。换言之,我们要仿真的目的是在管的一端加1pa的声压时,管的另一端不同频率下的声压分布。

山无忧的博客 1471

Uperf Game Turbo:Android 用户态性能控制器的情景识别机制、安装与配置调参实战

Uperf Game Turbo 是一个基于 Uperf 904 内核的 Android 用户态性能控制器 Magisk 模块,它不依赖 Java 框架层与第三方内核,通过监听触摸输入、主动采样 CPU 负载、监控 ActivityManager 与 SurfaceFlinger 等信号来识别使用情景,并据此动态写入 sysfs 节点控制性能释放。阅读本文后,你将掌握该模块的两种安装方式、五档性能

gitblog_00416的博客 685

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Android查看CPU和GPU使用率(五十五)

参考一 参考二 1、top -t 能打印出线程级别的CPU使用情况 0.打印进程的堆栈信息。从堆栈信息里可以通过.so辨别哪个线程是干什么的,从而在 top -t 的结果里去查找你想要的那个线程的 CPU 使用情况。 # debuggerd -b <pid> 1.查看高通821 GPU使用率 # adb shell cat /sys/class/kgsl/kgsl-3d0/g...

Android系统攻城狮 3万+

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

高通GPU频率动态调整机制

DVFS(Dynamic Voltage And Frequency Scaling)动态电压和频率调节,这里主要研究GPU频率动态的调节。 和CPU采用cpufreq框架动态调节频率类似,GPU这块采用了Linux devfreq框架。 Devfreq有四种对频率的管理策略governor: 1、  performance:GPU会固定工作在其支持的最高频率上,以追求最高性能。 2、 

crazyrandom的专栏 1万+

Android-查看GPU的使用率

# adb shell cat /sys/class/kgsl/kgsl-3d0/gpu_busy_percentage

menghaocheng的专栏 2万+

设置CPU核心

当系统启动的时候,在governorrestart的过程中,会重新初始化GPU所对应的频率,这样即使我们设置了我们想要的频率,最后也很快就被冲掉了,所以要把该interval_timeout设置为很大。如果需要稳定测试性能,不降频,可以把scaling_setspeed,scaling_max_freq ,scaling_min_freq 配置成比最大频率低的一个频率,具体的值需要和计算负载配合,如果跑满了所有核心,可以把频率配得低些。0表示该核心是offline状态的,1表示该核心是online状态的。

qq_42860913的博客 3927

adb命令调试(持续记录ing)

u0_a开头的都是Android的应用进程,Android的应用的UID是从10000开始,到19999结束,可以在Process.java中查看到(FIRST_APPLICATION_UID和LAST_APPLICATION_UID),u0_a后面的数字就是该应用的UID值减去FIRST_APPLICATION_UID所得的值,所以,对于截图这个应用进程,它是u0_a155,按前面的规制,它的UID就是155 + FIRST_APPLICATION_UID = 10155。所以这个时间,一般都很短。

m0_61097519的博客 3459

kgsl pool

kgsl pool

weixin_44901612的博客 864

Linux内存使用

来源:http://sns.linuxpk.com/space.php?uid=52196&do=blog&id=16754Linux内存使用      一直对Linux的内存使用情况有一些困惑,主要是各个属性的内存量不是很理解,到底哪部分是属于正在使用的,那部分是系统缓存的。所以这次专门简单得了解了一下,虽然是一个很小的知识点,但是对于理解系统还有有一些好处的,所以记下来:    free命令看一下内存使用状况:  [root@prdmis-db /]# free             

每天进步,每天分享 706

基于devfreq framework的GPU调频

AI时代已经来临,在日益增长的算力需求下,GPU已经成为AI世界不可或缺的工具,而移动端高渲染高帧应用也对移动端GPU提出越来越高的要求,本文将以高通的adreno gpu为例对GPU的调频进行介绍。在介绍之前,建议先阅读本文章《Linux devfreq framework剖析》,了解devfreq framework子系统中devfreq device的作用和governor的统一实现格式。G...

内核工匠 1786

Android常用节点-CPU/GPU

/sys/class/kgsl/kgsl-3d0/gpu_model:GPU版本 /sys/class/kgsl/kgsl-3d0/gpu_busy_percentage:GPU使用率 /sys/class/kgsl/kgsl-3d0/idle_timer:GPU进入idle模式的间隔长度,单位ms /sys/class/kgsl/kgsl-3d0/min_pwrlevel:GPU最小频率档...

paulfuture的专栏 4205

pytorch深度学习框架-训练模型时GPU占用率太低怎么办?如何尽量榨干我们的GPU性能?

pytorch深度学习框架-训练模型时GPU占用率太低怎么办?如何尽量榨干我们的GPU性能?

小坏蛋的博客 1万+

高通---GPU&CPU频率和工作模式的获取设置

1gpu信息获取 1.1 高通gpu说明        高通设备CPU采用cpufreq框架动态调节频率,相似的GPU这块采用了Linux devfreq框架进行调节。Devfreq有四种对频率的管理策略governor(框架规定,实际实现各厂商不同): 1、  performance:GPU会固定工作在其支持的最高频率上,以追求最高性能。 2、  powersave:GPU会固定工作在其支持的最低频率上,以追求最低的功耗。 3、&nbs

YoungHong1992 1万+

手机GPU使用率的获取

1. 高通平台 GPU使用率: adb shell "cat /sys/class/kgsl/kgsl-3d0/gpubusy" (前一个值/后一个值) * 100% = 使用率 2. MTK平台 GPU使用率: adb shell "cat /d/ged/hal/gpu_utilization" ...

苏法迪的专栏 7059
上一篇: 高通平台GPU动态调频DCVS . 篇2 . Framework & Procedure
下一篇: Android 快速获取App的包名和 Activity名字
DecJ
博客等级 码龄18年 537粉丝 25原创
评论 7
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值