高通---GPUCPU频率和工作模式的获取设置
1gpu信息獲取
1.1 高通gpu說明?
? ? ? 高通設備CPU采用cpufreq框架動態調節頻率,相似的GPU這塊采用了Linux?devfreq框架進行調節。Devfreq有四種對頻率的管理策略governor(框架規定,實際實現各廠商不同):
1、? performance:GPU會固定工作在其支持的最高頻率上,以追求最高性能。
2、? powersave:GPU會固定工作在其支持的最低頻率上,以追求最低的功耗。
3、? userspace:早期的管理策略,系統將變頻策略的決策交給了用戶態應用程序,并提供相應的接口供其使用。
4、? ondemand:userspace 是用戶態的檢測,效率低,而 ondemand 則是一個完全在內核態下工作并且能夠以更加細粒度的時間間隔對系統負載情況進行采樣分析的 ?governor 。
1.2高通設備gpu工作模式:
????Qualcomm的GPU則使用的是他們自己的governor:msm-adreno-tz,他和ondemand有點相似,是在內核態根據GPU的負載來動態決定如何變頻的。
?
高通給的可以手動調節GPU頻率的接口為:
echo 1 >/sys/class/kgsl/kgsl-3d0/force_clk_on
echo 10000000 >/sys/class/kgsl/kgsl-3d0/idle_timer
echo performance >/sys/class/kgsl/kgsl-3d0/devfreq/governor
echo <max freq | other freq> ?> /sys/class/kgsl/kgsl-3d0/gpuclk
參數設置解釋:
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之間,如果不對,就會就近選擇這三者之一。
1.3 相關gpu信息節點位置
設備gpu信息的獲取:
目錄:
/sys/class/kgsl/kgsl-3d0
gpubusy? 獲取gpu使用率
gpuclk?? gpu工作頻率
max_gpuclk? 最大工作頻率
gpu_available_frequencies? 可用頻率
force_clk_on?? 寫入1,可以動態調節頻率
devfreq ->../../devfreq/1c00000.qcom,kgsl-3d0?
目錄:
/sys/class/kgsl/kgsl-3d0/devfreq
available_frequencies?? //可用gpu頻率
available_governors??? //可用gpu模式
cur_freq????????????? //當前工作頻率
device ->../../../1c00000.qcom,kgsl-3d0
governor???????? //當前工作設置的模式
max_freq??????? //最大gpu工作頻率
min_freq??????? //最小gpu工作頻率
polling_interval?
power?????????
subsystem ->../../../../../class/devfreq
target_freq???
trans_stat???
uevent
1.4 gpu信息獲取
Gpu使用率獲取:會得到兩個值,(前一個/后一個)*100%=使用率
adb shell cat?? /sys/class/kgsl/kgsl-3d0/gpubusy
?
Gpu工作頻率:
adb shell cat?? /sys/class/kgsl/kgsl-3d0/gpuclk
adb shell cat?? /sys/class/kgsl/kgsl-3d0/devfreq/cur_freq
?
Gpu最大、最小工作頻率:
adb shell cat? /sys/class/kgsl/kgsl-3d0/devfreq/max_freq
adb shell cat? /sys/class/kgsl/kgsl-3d0/devfreq/min_freq
?
Gpu可用頻率
adb shell cat?? /sys/class/kgsl/kgsl-3d0/gpu_available_frequencies
adb shell cat?? /sys/class/kgsl/kgsl-3d0/devfreq/available_frequencies
?
Gpu可用工作模式:
adb shell cat?? /sys/class/kgsl/kgsl-3d0/devfreq/available_governors
?
Gpu當前工作模式:
adb shell cat??? /sys/class/kgsl/kgsl-3d0/devfreq/governor
1.5 高通820設備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,
?
?2 CPU信息的獲取
2.1cpu核心數
設備 sys/devices/system/cpu目錄下可看到CPU有幾個核心,如果四核分別命名為cpu0,cpu1,cpu2,cpu3,每個都是一個文件夾,進入可以查看每個核心的信息。
affected_cpus? //當前工作核心 0 1 2 3
cpu0
cpu1
cpu2
cpu3
cpufreq
cpuidle
kernel_max
modalias
offline
online
possible
power
present
uevent
Cpu0文件夾內部:
cpufreq
cpuidle
online
power
rq-stats
subsystem
topology
uevent
cpufreq文件夾內部:
affected_cpus
cpuinfo_cur_freq
cpuinfo_max_freq
cpuinfo_min_freq
cpuinfo_transition_latency
related_cpus
scaling_available_frequencies//可用頻率
scaling_available_governors//可用模式
scaling_cur_freq//當前頻率
scaling_driver
scaling_governor//模式
scaling_max_freq //最大頻率
scaling_min_freq//最小頻率
scaling_setspeed
stats
?
2.2關閉開啟cpu
cat?/sys/devices/system/cpu/cpu0/online
文件中0表示該核心是offline狀態的,關閉狀態,1表示該核心是online狀態的,開啟狀態。
echo "0" >/sys/devices/system/cpu/cpu0/online # 關閉該CPU
echo "1" > /sys/devices/system/cpu/cpu0/online# 打開該CPU
?
2.3設置CPU工作模式
Cpu支持多種工作模式governor,模式主要對cpu工作頻率進行修改,修改前需要查下CPU支持哪些模式:
adb shell cat??? /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors
列舉常見的幾種工作模式:
interactive ondemand userspacepowersave performance
performance性能最好,不降頻,cpu核心會一直保持在可用的最高頻率,ondemand表示使用內核提供的功能,可以動態調節頻率,powersvae表示省電模式,通常是在最低頻率下運行,
userspace表示用戶模式,在此模式下允許其他用戶程序調節CPU頻率。
echo "performance" >/sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
2.4Cpu頻率修改
CPU的頻率不可隨意修改,scaling_available_frequencies文件列舉了支持的頻率,
adb shell cat?? /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_frequencies
我的820設備工作頻率:
200000 400000 533333 800000 9984001094400 1152000 1209600頻率以Hz為單位的
echo "1209600" >/sys/devices/system/cpu/cpu0/cpufreq/scaling_setspeed
設置好后,我們可以通過scaling_cur_freq文件查看當前這個核心的工作頻率
adb shell cat????? /sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq
最后我們也可以設置下CPU的最大和最小頻率,只需要將需要設置的頻率值寫入scaling_max_freq和scaling_min_freq即可
?
echo "1152000? " >/sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq # 設置最大頻率
echo "200000" >/sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq # 設置最小頻率
? ? ? ? ?設置時“最大值”需要大于等于“最小值”,如果把最小值設置為了最大值,則可用的頻率只有最大值,相當于把模式調成performance。這里設置僅為某個,你需要對每個online的CPU核心都進行設置,同時以上對文件的修改均需要root權限。 可通過減少工作的核心數和限制CPU頻率起到節省電量的目的,但是性能也是顯著降低,但不能引起卡頓,引起了卡頓性能降低的太厲害了就不值得了。
?
2.5 gpu信息獲取的腳本
?下面的代碼是gpu信息獲得腳本,保存成x.pl文件可以獲取gpu信息:
?
#!/usr/bin/perl -w
?
???print "\n";
?
?$gpumax = `adb shell cat?/sys/class/kgsl/kgsl-3d0/devfreq/max_freq`;
?$gpumin = `adb shell cat?/sys/class/kgsl/kgsl-3d0/devfreq/min_freq`;
?$gpuavaifre=`adb shell cat/sys/class/kgsl/kgsl-3d0/gpu_available_frequencies`;
?printf("GPU 最大頻率: %5.2f\n", $gpumax);
?printf("GPU 最小頻率: %5.2f\n", $gpumin);
?printf("GPU 可用頻率: %s\n", $gpuavaifre);
?printf("===================================\n");
?
$lastgpumod="xxxxx";
while(1)
{
?
???&busy;
???print "\n";
???sleep 1 ;
}
???sub busy
???{
?
??????? $gpu3d = `adb shell cat/sys/class/kgsl/kgsl-3d0/gpubusy`;
??????? $pct = 0.0;
??????? if( $gpu3d =~ m/\s*(\d+)\s+(\d+)/)
??????? {
?
??????????? if( $1 > 0 && $2 > 0)
??????????? {
?????????????? $pct = $1 / $2 * 100;
??????????? }
??????????? printf("3D GPU Busy:%5.2f\n", $pct);
??????????? printf("\n");
???????????
??????? }
?
??$gpucurmod= ` adb shell cat /sys/class/kgsl/kgsl-3d0/devfreq/governor`;
?
??if($lastgpumod ne? $gpucurmod){
??printf("GPU 當前模式: %s\n", $gpucurmod);
??$lastgpumod=$gpucurmod;
??}
?????#? printf("GPU lastmoshi:%s\n", $lastgpumod);??
??$gpucurfreq = `adb shell cat /sys/class/kgsl/kgsl-3d0/gpuclk `;
??$gpucurfreq2 = `adb shell cat/sys/class/kgsl/kgsl-3d0/devfreq/cur_freq`;
?
??printf("GPU 當前頻率: %s\n", $gpucurfreq);
??#printf("GPU 當前頻率2: %s\n", $gpucurfreq2);
?
}
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的高通---GPUCPU频率和工作模式的获取设置的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux驱动修炼之道-内存映射
- 下一篇: Linux 打开/关闭CPU命令