当先锋百科网

首页 1 2 3 4 5 6 7

CPU目录

查看数据

在手机上,我们可以进入adb shell查看cpu相关信息,例如
在这里插入图片描述
在/sys/devices/system/cpu目录下可以看到你的CPU有几个核心,如果是双核,就是cpu0和cpu1,如果是四核,还会加上cpu2和cpu3,像我们手中现在这部手机就是八核的。
在这里插入图片描述
可以进入present查看设备最多支持多少个CPU
在这里插入图片描述
可以进入online查看哪些CPU在线,反之也可以进入offline查看不在线的CPU

其他

高通平台的话在cpufreq目录下面有/interactive目录可以设置升频降频的延时以及一些其他操作

单个CPU目录

cpufreq

开启核心

进入单个cpu后,可以查看单独核心的内容
在这里插入图片描述
online里的内容代表这个核心有没有被开启,0代表关闭,1代表开启。
在这里插入图片描述
我们也可以运用命令来调整它的状态

echo 0 > /sys/devices/system/cpu/cpu0/online # 关闭该核心
echo 1 > /sys/devices/system/cpu/cpu0/online # 打开该核心

其余参数可以进入cpufreg查看
在这里插入图片描述

  • cpuinfo_min_freg cpu最小频率
  • cpuinfo_max_freg cpu最大频率
  • cpuinfo_cur_freg cpu当前频率
  • cpuinfo_transition_latency:该文件定义了处理器在两个不同频率之间切换时所需要的时间 (单位: 纳秒)
  • scaling_available_frequencies:所有支持的主频率列表 (单位: 千赫兹)
  • scaling_available_governors:该文件显示当前内核中支持的所有cpufreq governor类型
  • scaling_cur_freq:被governor和cpufreq核决定的当前CPU工作频率。该频率是内核认为该CPU当前运行的主频率
  • scaling_driver:该文件显示该CPU正在使用何种cpufreq driver
  • scaling_governor:通过echo命令,能够改变当前处理器的governor类型
  • scaling_max_freq:显示当前policy的上下限 (单位: 千赫兹)需要注意的是,当改变cpu policy时,需要首先设置scaling_max_freq, 然后才是scaling_min_freq
  • scaling_setspeed:如果用户选择了“userspace” governor, 那么可以设置cpu工作主频率到某一个指定值。只需要这个值在scaling_min_freq 和 scaling_max_freq之间即可

governor

前面我们说到,scaling_available_governors可以显示当前内核中支持的所有cpufreq governor类型,那么原生支持的cpufreq governor有哪些呢

在本机器中,总共支持5种

ondemand userspace powersave performance schedutil

各个项目有所不同,具体查看自己手机内所支持的governor。

  • performance :只注重效率,将CPU频率固定工作在其支持的最高运行频率上,而不动态调节。
  • powersave:将CPU频率设置为最低的所谓“省电”模式,CPU会固定工作在其支持的最低运行频率上,而不动态调节。
  • Userspace:最早的cpufreq 子系统通过userspace governor为用户提供了这种灵活性。系统将变频策略的决策权交给了用户态应用程序,并提供了相应的接口供用户态应用程序调节CPU 运行频率使用。也就是长期以来都在用的那个模式。可以通过手动编辑配置文件进行配置
  • ondemand :按需调节cpu频率,不操作手机的时候控制在最低频率,滑屏或进入应用后会迅速提升至最高频率,当空闲时迅速降低频率,性能较稳定,但因频率变化幅度过大,省电方面只有一般的水平。是一种在电池和性能之间趋向平衡的默认模式,但是对于智能手机来说,ondemand在性能表现方面略有欠缺。
  • schedutil:这一个方式是linux kernel 4.7中被合入的,它直接使用来自scheduler的负载数据加速调频,支持从中断上下文直接切换频率机制,可以进一步缩短调频的时延。加强了功耗和性能的表现,同时增强了二者。
    具体可以参考文章https://deepinout.com/android-system-analysis/android-cpu-related/principle-analysis-of-cpu-governor-schedutil.html
    在此项目中默认使用的是schedutil。
    我们也可以通过命令去改变它的策略

echo userspace(或者其他策略) > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor

然后使用命令去查看更改是否成功

cat scaling_governor

频率

首先,我们可以通过

cpuinfo_min_freg cpu
cpuinfo_max_freg cpu
cpuinfo_cur_freg

去查看CPU的最大、最小、当前频率,并且可以通过

scaling_available_frequencies

查看cpu支持的频率
那么我们如果要调整cpu的频率,我们首先需要进入用户模式,也就是将governor调整至userspace

echo userspace > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
然后
echo 1000000 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq
echo 1000000 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq

我们就可以看到cpu频率发生改变了,但是这个频率设定要在支持范围之内
在这里插入图片描述

mtk芯片配置app白名单路径

vender/mediatek/proprietary/hardware/power/config/mt[xxxx]/app_list
在这个名单目录里面,我们可以对特定的APP进行调整和配置

在这里插入图片描述

例如这一个配置,就是对zee5APP的配置(百度出来是一个印度的视频点播软件),这个软件只调整了CPU频率,还有其他的软件调整了帧率或者DDR或者GPU。

在这张图里面这两个参数的意思分别是
PERF_RES_CPUFREQ_MIN_CLUSTER_0: 是对小核频率的最小值的修改,也就是在运行这个软件时CPU的最小频率也会达到1.4GHz
PERF_RES_CPUFREQ_MIN_CLUSTER_1: 是对大核频率的最小值的修改,也就是在运行这个软件时CPU的最小频率也会达到1.4GHz
若CPU最高频率不到1.4GHz,则默认最高频运行

那么由此我们可以延展出更多的参数含义

Resource ID含义更改方案
PERF_RES_CPUFREQ_PERF_MODE CPU高性能模式1:开启,打开CPU所有核心并且拉到最高频
PERF_RES_CPUCORE_MIN_CLUSTER_0使用的最少CPU小核数量
PERF_RES_CPUCORE_MIN_CLUSTER_1使用的最小CPU大核数量
PERF_RES_CPUCORE_MAX_CLUSTER_0使用的最多CPU小核数量
PERF_RES_CPUCORE_MAX_CLUSTER_1使用的最多CPU大核数量
PERF_RES_SCHED_PREFER_IDLE_TA倾向于向顶级应用使用空闲CPU0代表不可用 1代表开启
PERF_RES_SCHED_PREFER_IDLE_FG倾向于向前台应用使用空闲CPU0代表不可用 1代表开启
PERF_RES_SCHED_BOOST设置大核优先默认是0 ,0代表不可用,1代表倾向于所有任务都放在大核上处理,2代表通过CPUSET将top和fg应用放在大核上
这里的参数都是core number,输入想要使用的核数量

DDR

在mtk的官网,我们可以找到查找到有关CPU、DDR或者GPU的相关命令,但是这里有一个问题,那就是现在手上接触的是KI7项目,它的内核kernel是-4.x版本的,而mtk给的标准查看DDR命令是-5.x版本的,所以我们要进行一些对应的更改

更改DDR频率

如果要将DDR频率调至对大,则

adb shell “echo 0 > /sys/devices/platform/10012000.dvfsrc/helio-dvfsrc/dvfsrc_req_ddr_opp”

查看当前的DDR频率(Current)

adb shell “cat /sys/devices/platform/10012000.dvfsrc/helio-dvfsrc/dvfsrc_dump | grep -e uv -e khz”

但是,如果要查看内核kernel版本为-5.x版本的话,指令就要分别改为

adb shell “echo 0 > /sys/kernel/helio-dvfsrc/dvfsrc_force_vcore_dvfs_opp”----------将DDR频率调至最大

adb shell “cat /sys/kernel/helio-dvfsrc/dvfsrc_dump | grep -e uv -e khz” 查看当前的DDR频率

在代码中提高DDR频率

在kernel层中:
参考 kernel-4.14/drivers/misc/mediatek/usb_boost/v1/usb_boost_plat.c
1) Makefile:
ccflags-y += -I$(srctree)/drivers/devfreq/

2) kernel usage:
          #include <linux/pm_qos.h>
          #include "helio-dvfsrc-opp.h"

          static struct pm_qos_request xxx_ddr_req;

          pm_qos_add_request(&xxx_ddr_req, PM_QOS_DDR_OPP_DEFAULT_VALUE);

          pm_qos_update_request(&xxx_ddr_req, DDR_OPP_0); //LP4-3200, LP3-1866, 最高檔
          pm_qos_update_request(&xxx_ddr_req, DDR_OPP_1); //LP4-2400, LP3-1600 or above
          pm_qos_update_request(&xxx_ddr_req, DDR_OPP_3); //LP4-1600, LP3-1200 or above

          pm_qos_update_request(&xxx_ddr_req, DDR_OPP_UNREQ); //un-request, or PM_QOS_DDR_OPP_DEFAULT_VALUE

          可以参考:
          static int vcorefs_hold(struct act_arg_obj *arg)
          {
                    pm_qos_update_request(&pm_qos_ddr_req, DDR_OPP_0);
                    return 0;
          }

          static int vcorefs_release(struct act_arg_obj *arg)
          {
                    pm_qos_update_request(&pm_qos_ddr_req, DDR_OPP_UNREQ);
                    return 0;
          }

         注意:vcorefs_hold 和 vcorefs_release要对应起来,否则会有power问题。

在java代码中更改,要查看mtk官网中给的接口怎么使用,每个版本都有区别

GPU

GPU也就是图形处理器,我们一般俗称“显卡”,一款GPU的好坏,主要取决于它的多边形生成能力和像素渲染能力。

一般来说GPU的使用都是正常的,如果不对劲就要check GPU 。
在这里插入图片描述

如下两种情况需要check GPU:
1、 wait for GPU completion 时间超过1个vsync, 且没有hwc release时间长
若有hwc release 时间长,需要check SurfaceFlinger
2、GPU相关function 除runnable以外的持续时间较对比机长
若有runnable时间长,则需要check runnable 时间长的原因

方法为

确认是GPU处理时间长,可以先boost GPU试试看,不管是否有效,可以将结果带给GPU owner。

boost方式为:

adb shell “cat /proc/gpufreq/gpufreq_opp_dump” //确认GPU所支持的档位

[0] freq = 850000, volt = 80000, vsram = 90000, gpufreq_power = 935

[1] freq = 823000, volt = 78750, vsram = 88750, gpufreq_power = 885

adb shell “echo 850000 > /proc/gpufreq/gpufreq_opp_freq” //将最大值设置下去,因platform不同,所支持的最大值不同

如果GPU频率/gpu_time与对比机明显有差异,可以尝试调整GPU policy:

/
//Game APP是否配置了 GPU min/max freq,如果有,尝试调整GPU min/max档位,提升performance or 降低power


// loading-based margin (非单一 render thread),拉频预留的天花板百分比
// 数字越大,性能越好,但功耗会变差 ,表示gpu loading (100-50)=50% 时, 会拉一次gpu freq
// 默认30 ,表示loading达到 70%的时候就开始升4档


// 本参数和PERF_RES_GPU_GED_TIMER_BASE_DVFS_MARGIN配合使用,每次会拉高几个档位调频,数字越大,越for GPU performance,相对power越多


// GPU DVFS margin value with frame-based margin,多线程版本用loading base,其它用 framebase, 预留的GPU能力,对应节点是/sys/kernel/debug/ged/hal/dvfs_margin_value
// 百位1~5 表示 dynamic margin,即加1%~30%
// margin越大表示gpu 调频越积极, 当然功耗也会上去一些,默认是130。

在这里插入图片描述