今天给大家带来最近工作中用到的关于gpu&cpu信息获取的节点的读取。
高通设备CPU采用cpufreq框架动态调节频率,相似的GPU这块采用了Linux devfreq框架进行调节。Devfreq有四种对频率的管理策略governor(框架规定,实际实现各厂商不同):
1、 performance:GPU会固定工作在其支持的最高频率上,以追求最高性能。
2、 powersave:GPU会固定工作在其支持的最低频率上,以追求最低的功耗。
3、 userspace:早期的管理策略,系统将变频策略的决策交给了用户态应用程序,并提供相应的接口供其使用。
4、 ondemand:userspace 是用户态的检测,效率低,而 ondemand 则是一个完全在内核态下工作并且能够以更加细粒度的时间间隔对系统负载情况进行采样分析的 governor 。
msm-adreno-tz,他和ondemand有点相似,是在内核态根据GPU的负载来动态决定如何变频的。
高通给的可以手动调节GPU频率的接口为:
参数设置解释:
1、echo 1 > force_clk_on是设置KGSL_PWRFLAGS_CLK_ON这个power_flags。使用echo freq > gpuclk时,是通过kgsl_pwrctrl_pwrlevel_change设置频率,它会判断KGSL_PWRFLAGS_CLK_ON这个power_flags,如果没有这个flag,可能就不会真正的设置频率。
2、echo 10000000 > idle_timer,,设置interval_timeout,默认值是80ms。
当系统启动的时候,在governorrestart的过程中,会重新初始化GPU所对应的频率,这样即使我们设置了我们想要的频率,最后也很快就被冲掉了,所以要把该interval_timeout设置为很大。
3、echo performance > devfreq/governor, 这时devfreq会为Adreno重新选择governor,也就是performance。这时它会使用GPU所支持的最大频率,而不考虑系统的负载。
默认的msm-adreno-tz机制会不停的动态更新频率,即使我们设置过频率也会被覆盖掉,这就是为什么直接设置频率无效的原因。而如果改成performance机制,这样它会使得Adreno动态的调整机制无效,我们的设置才会生效。
4、echo freq > gpuclk,简单的设置GPU的频率,一般是在200 000 000, 320 000 000和450 000 000之间,如果不对,就会就近选择这三者之一。
设备gpu信息的获取:
目录:
Gpu使用率获取:会得到两个值,(前一个/后一个)*100%=使用率
adb shell cat /sys/class/kgsl/kgsl-3d0/gpubusy
Gpu工作频率:
Gpu最大、最小工作频率:
Gpu可用频率
Gpu最大、最小工作频率:
624000000
401800000
模式:msm-adreno-tz
Gpu可用频率
624000000 560000000 510000000401800000 315000000 214000000 133000000
(1)无论在灭屏、亮屏、还是在gpu消耗90%以上的条件下,GPU的工作模式都没有改变,全都是msm-adreno-tz。
(2)Gpu使用率、频率获取:
亮屏状态下:
对于tsvr Launcher应用,转动设备(场景复杂度不同),gpu使用率78-82%时,gpu频率510000000,560000000(很少出现);
Gpu使用率70%-75%时,gpu频率为401800000
小蜜蜂游戏:游戏运行过程中gpu使用率大约72-80%,频率为315000000 ,游戏结束不退出,gpu使用率 75%-85% 左右,gpu频率为560000000 || 640000000
VRhero应用:
运行过程中,gpu使用率78%-83%,gpu频率510000000,560000000,624000000,其中大部分时间段频率为560000000,624000000.
Vr Coaster应用:
运行过程中gpu使用率70-81%,gpu频率624000000,560000000,510000000.
Nijia切水果游戏:
游戏运行过程中Gpu使用率62%-71%,gpu频率214000000(极少出现),315000000,401800000,510000000
灭屏状态下:
灭屏前停留在主界面,GPU使用率在刚灭屏前3-5分钟gpu使用率会维持在75%-81%,gpu工作频率(401800000出现占80%,510000000出现次数占20%);后面会维持在70%-73%之间,GPU工作频率(401800000).
灭屏前停留在more app界面:
Gpu使用率维持在79-81%,gpu频率为315000000,
设备 sys/devices/system/cpu目录下可看到CPU有几个核心,如果四核分别命名为cpu0,cpu1,cpu2,cpu3,每个都是一个文件夹,进入可以查看每个核心的信息。
Cpu支持多种工作模式governor,模式主要对cpu工作频率进行修改,修改前需要查下CPU支持哪些模式:
CPU的频率不可随意修改,scaling_available_frequencies文件列举了支持的频率,
设置好后,我们可以通过scaling_cur_freq文件查看当前这个核心的工作频率
adb shell cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq
最后我们也可以设置下CPU的最大和最小频率,只需要将需要设置的频率值写入scaling_max_freq和scaling_min_freq即可
设置时“最大值”需要大于等于“最小值”,如果把最小值设置为了最大值,则可用的频率只有最大值,相当于把模式调成performance。这里设置仅为某个,你需要对每个online的CPU核心都进行设置,同时以上对文件的修改均需要root权限。 可通过减少工作的核心数和限制CPU频率起到节省电量的目的,但是性能也是显著降低,但不能引起卡顿,引起了卡顿性能降低的太厉害了就不值得了。
下面的代码是gpu信息获得脚本,保存成x.pl文件可以获取gpu信息: