高通Perflock

news/2024/12/26 1:20:44/文章来源:https://www.cnblogs.com/linhaostudy/p/18306180

高通的Perflock是Qualcomm公司开发的一项技术,用于优化设备性能和功耗管理。Perflock是一种锁定机制,允许操作系统或应用程序在需要时对处理器的性能状态进行控制,从而确保在关键任务或高性能需求的情况下,处理器能够维持在高性能状态。

主要功能和特点

  1. 性能锁定:Perflock允许应用程序或系统服务锁定CPU的频率或性能状态,以满足高性能需求。例如,在运行高性能游戏或进行繁重的计算任务时,可以使用Perflock确保CPU保持在高频率下运行。

  2. 功耗管理:在不需要高性能时,Perflock可以解除锁定,允许处理器降低频率,从而节省电量并降低功耗。

  3. 灵活性:开发者可以通过API接口使用Perflock,根据具体需求动态调整处理器的性能状态。

  4. 兼容性:Perflock主要应用于搭载Qualcomm处理器的设备,如智能手机和平板电脑。

应用场景

  • 游戏:在运行大型3D游戏时,使用Perflock可以确保游戏流畅运行,不会因为处理器降频而影响用户体验。
  • 多媒体处理:在视频编辑或其他多媒体处理应用中,Perflock可以提高处理速度和效率。
  • 系统任务:系统更新或备份等任务需要长时间高性能运行时,Perflock可以提供必要的性能支持。

如何使用高通perflock

image

Perflock的API封装在libqti-perfd-client.so库里面(源码在android/vendor/qcom/proprietary/commonsys-intf/android-perf/mp-ctl/client.cpp),主要包含三个方法:

  • int perf_lock_acq(int handle, int duration, int list[], int numArgs)
  • int perf_lock_rel(int handle)
  • int perf_hint(int hint, const char *pkg, int duration, int type)

Perflock的使用

可以通过perf_lock_acq和perf_lock_rel来提频操作。

handle参数

调用perf_lock_acq或perf_hint会返回一个handle,该Handle可以存起来后面继续使用。

第一次调用perf_lock_acq或perf_hint方法时,handle为0,perflock会创建一个新的handle

示例:

mHandle = (m_pPerfLockOps->perfLockAcquire(mHandle,timer,m_pPerflockInfo->perfLockParams,m_pPerflockInfo->perfLockParamsCount));

duration

表示要让Perf engine LOCK住多久,单位是ms。

如果设置为0,则表示无限时间。

list[] 和 numArgs

list[]是要传递给Perf Engine的参数,每2个参数为一组[resource, value],numArgs为参数个数。

list[] 和 numArgs示例:

{ // PERF_LOCK_OPEN_CAMERAperfLockParamsOpenCamera,sizeof(perfLockParamsOpenCamera) / sizeof(INT32)
},

perfLockParamsOpenCamera定义为:

static INT32 perfLockParamsOpenCamera[] =
{// Disable power collapse and set CPU clocks to turboMPCTLV3_ALL_CPUS_PWR_CLPS_DIS,          0x1,MPCTLV3_SCHED_BOOST,                    0x1,MPCTLV3_MAX_FREQ_CLUSTER_BIG_CORE_0,    0xFFF,MPCTLV3_MIN_FREQ_CLUSTER_BIG_CORE_0,    0xFFF,MPCTLV3_MAX_FREQ_CLUSTER_LITTLE_CORE_0, 0xFFF,MPCTLV3_MIN_FREQ_CLUSTER_LITTLE_CORE_0, 0xFFF,MPCTLV3_MIN_FREQ_CLUSTER_PLUS_CORE_0,   0xFFF,MPCTLV3_MAX_FREQ_CLUSTER_PLUS_CORE_0,   0xFFF
};

可以看出来Open Camera时是

  • 关闭power collapse
  • 使能SCHED_BOOST
  • 大核、小核、超大核都切成turbo模式

perf_lock_rel

释放持有的perfLock,具体是哪个perflock由参数handle决定。

如果perf_lock_acq有设置duration,则不需要调用perf_lock_rel。

示例
在一个Native进程中使用PerfLock来调出两个核。

Makefile

LOCAL_SHARED_LIBRARIES := liblog libcutils libdl libqti-perfd-client
LOCAL_C_INCLUDES := device/qcom/common/power

源代码

#include <dlfcn.h>
#include “performance.h”
static void *qcopt_handle;
static int (*perf_lock_acq)(int handle, int duration, int list[], int numArgs);
static int (*perf_lock_rel)(int handle);
static int perf_lock_handle;
char opt_lib_path[PATH_MAX] = {0};
if (property_get("ro.vendor.extension_library", opt_lib_path, NULL) != 0) {if((qcopt_handle = dlopen(opt_lib_path, RTLD_NOW)) == NULL) {error_out();} else {perf_lock_acq = (int(*)(int, int, int*,int))dlsym(qcopt_handle, "perf_lock_acq");perf_lock_rel = (int(*)(int))dlsym(qcopt_handle, "perf_lock_rel");}
}
int perf_lock_opts[1] = {CPUS_ONLINE_MIN_2};
perf_lock_handle = perf_lock_acq(perf_lock_handle, 0, perf_lock_opts, 1);
// Critical section requiring PerfLock
perf_lock_rel(perf_lock_handle);

具体可参考代码:vendor/qcom/proprietary/android-perf/tests/ModuleTests/mp-ctl/perflock_native_test.cpp

PowerHint的使用

使用PowerHint需要先在powerhint.xml里面定义一个HintID,然后再调用perf_hint让其生效。

PowerHint XML位置: vendor/qcom/opensource/power/config/bengal/powerhint.xml,系统中,该文件存放在/vendor/etc/powerhint.xml"

其他XML文件位置定义如下:

#define PERF_MAPPING_XML "/vendor/etc/perf/perfmapping.xml"
#define PERF_BOOSTS_CONFIGS_XML "/vendor/etc/perf/perfboostsconfig.xml"
#define POWER_CONFIGS_XML "/vendor/etc/powerhint.xml"
#define COMMONRESOURCE_CONFIGS_XML "/vendor/etc/perf/commonresourceconfigs.xml"
#define TARGETRESOURCE_CONFIGS_XML "/vendor/etc/perf/targetresourceconfigs.xml"

语法:

int perf_hint(int hint, const char *pkg, int duration, int type)
  • hint- 识别每个Hit的ID。
  • Pkg- 谁触发这个Hint。
  • Duration- Duration of the hint perflock.
  • Type- To differentiate between similar action, like horizontal scroll/vertical scroll,一般可以传-1。

常用Resource ID

Resource ID Resource Name Description Description
0x40400000 MPCTLV3_TOGGLE_POWER_COLLAPSE 是否允许CPU进入深度低功耗模式 /dev/cpu_dma_latency,默认空,不允许则设置为1
0x40C00000 MPCTLV3_SCHED_BOOST 1 (Fullthrottle), 2(Conservative),3(Restrained) SCHED加速类型 /proc/sys/kernel/sched_boost
0x40800100 MPCTLV3_MIN_FREQ_CLUSTERLITTLE CORE_0 设置小核最小频率,十六进制 /sys/module/msm_performance/p arameters/cpu_min_freq
0x40804100 MPCTLV3_MAX_FREQ_CLUSTERLITTLE CORE_0 设置小核最大频率,十六进制 /sys/module/msm_performance/p arameters/cpu_max_freq
0x40800000 MPCTLV3_MIN_FREQ_CLUSTER_BIG_CO RE_0 设置大核最小频率,十六进制 /sys/module/msm_performance/p arameters/cpu_min_freq
0x40804000 MPCTLV3_MAX_FREQ_CLUSTER_BIG_CO RE_0 设置大核最大频率,十六进制 /sys/module/msm_performance/p arameters/cpu_max_freq
0X42804000 MPCTLV3_GPU_MIN_POWER_LEVEL 设置GPU最小PowerLevel,十六进制 /sys/class/kgsl/kgsl3d0/min_pwrlevel
0X42808000 MPCTLV3_GPU_MAX_POWER_LEVEL 设置GPU最大PowerLevel,十六进制 /sys/class/kgsl/kgsl3d0/max_pwrlevel
0x41000000 MPCTLV3_MIN_ONLINE_CPUCLUSTER 最小几个大核Online /sys/devices/system/cpu/cpu*/cor e_ctl/min_cpus
0x41004000 MPCTLV3_MIN_ONLINE_CPUCLUSTER BIG 最多几个大核Online /sys/devices/system/cpu/cpu*/cor e_ctl/max_cpus
0x41000100 MPCTLV3_MIN_ONLINE_CPUCLUSTER LITTLE 最小几个小核Online /sys/devices/system/cpu/cpu*/cor e_ctl/min_cpus
0x41004100 MPCTLV3_MAX_ONLINE_CPUCLUSTER LITTLE 最多几个小核Online /sys/devices/system/cpu/cpu*/cor e_ctl/max_cpus
0x41000200 MPCTLV3_MIN_ONLINE_CPUCLUSTER PRIME 最小几个超大核Online /sys/devices/system/cpu/cpu*/cor e_ctl/min_cpus
0x41800000 MPCTLV3_CPUBW_HWMON_MIN_FREQ CPU请求的最小DDR频率 /sys/class/devfreq/soc:qcom,cpub w/min_freq
0x41818000 MPCTLV3_CPUBW_HWMON_MAX_FREQ CPU请求的最大DDR频率 /sys/class/devfreq/soc:qcom,cpub w/max_freq

OpenCamera过程中,将所有CPU都拉满

static INT32 perfLockParamsOpenCamera[] =
{// Disable power collapse and set CPU clocks to turboMPCTLV3_ALL_CPUS_PWR_CLPS_DIS,          0x1,MPCTLV3_SCHED_BOOST,                    0x1,MPCTLV3_MAX_FREQ_CLUSTER_BIG_CORE_0,    0xFFF,MPCTLV3_MIN_FREQ_CLUSTER_BIG_CORE_0,    0xFFF,MPCTLV3_MAX_FREQ_CLUSTER_LITTLE_CORE_0, 0xFFF,MPCTLV3_MIN_FREQ_CLUSTER_LITTLE_CORE_0, 0xFFF,MPCTLV3_MIN_FREQ_CLUSTER_PLUS_CORE_0,   0xFFF,MPCTLV3_MAX_FREQ_CLUSTER_PLUS_CORE_0,   0xFFF
};

PerfLock in Camera

CamX

CamX中有一个类:CamxPerfLockManager,封装了对perflock的使用,代码路径为:vendor/qcom/proprietary/camx/src/osutils/camxperf.cpp

CHI

CHI也有一个类:PerfLockManager,封装了对perflock的使用,代码路径为:vendor/qcom/proprietary/chi-cdk/core/chiutils/chxperf.cpp

Perflock 调试

Log

adb root 
adb remount(disable verity if needed) 
adb shell "echo vendor.debug.trace.perf=1 >> /system/build.prop" 
adb reboot

然后从Log里面能看到如下打印:

07-10 16:07:27.575 13212 13212 E ANDR-PERF-MPCTL: perf_lock_acq: client_pid=1007, client_tid=1095, inupt handle=0, duration=80 ms, 
num_args=18, list=0x43000000 0x19 0x40800000 0x3E8 0x40800100 0x3E8 0x40800200 0x3E8 0x40C00000 0x2 0x43400000 0x1F40 0x40C74000 0xFF
0x40408000 0x63 0x41000000 0x3 
07-10 16:07:27.575 13212 13212 E ANDR-PERF-MPCTL: perf_lock_acq: output handle=1
07-10 16:07:27.576 13212 13212 E ANDR-PERF-MPCTL: perf_lock_acq: client_pid=1007, client_tid=1095, inupt handle=0, duration=0 ms, num_args=18, 
list=0x43000000 0x11 0x40800000 0x3E8 0x40800100 0x3E8 0x40800200 0x3E8 0x40C00000 0x2 0x43400000 0x1F40 0x40C74000 0xFF 0x40408000 0x63 
0x41000000 0x3 
07-10 16:07:27.576 13212 13212 E ANDR-PERF-MPCTL: perf_lock_acq: output handle=2
07-10 16:07:27.649 13212 13213 E ANDR-PERF-MPCTL: perf_lock_rel: input handle=2
07-10 16:07:27.660 13212 13213 E ANDR-PERF-MPCTL: perf_lock_rel: input handle=1

如果需要更多Log,可以打开QC_DEBUG:

在vendor/qcom/proprietary/android-perf/mp-ctl/, 在makefile中打开 QC_DEBUG flag

Dump

可以执行

dumpsys vendor.perfservice

来dump 处于active状态的 request list。

实验验证CPU/GPU/DDR最高频

关闭perflock和thermal

adb shell su -c setenforce 0
adb shell stop thermal-engine
adb shell stop perf-hal-1-0
adb shell stop perfd

perf-hal的版本要注意不一定是1.0,具体的perf hal版本可以参考:vendor/qcom/proprietary/android-perf/perf-hal/xxxx.rc

关闭 low power model

adb shell "echo Y > /sys/module/lpm_levels/parameters/sleep_disabled“

online 所有 cpus

adb shell "echo 4 > /sys/devices/system/cpu/cpu0/core_ctl/min_cpus“
adb shell "echo 4 > /sys/devices/system/cpu/cpu0/core_ctl/max_cpus“
adb shell "echo 4 > /sys/devices/system/cpu/cpu4/core_ctl/min_cpus"
adb shell "echo 4 > /sys/devices/system/cpu/cpu4/core_ctl/max_cpus"
adb shell "echo 1 > /sys/devices/system/cpu/cpu0/online"
adb shell "echo 1 > /sys/devices/system/cpu/cpu1/online"
adb shell "echo 1 > /sys/devices/system/cpu/cpu2/online"
adb shell "echo 1 > /sys/devices/system/cpu/cpu3/online"
adb shell "echo 1 > /sys/devices/system/cpu/cpu4/online"
adb shell "echo 1 > /sys/devices/system/cpu/cpu5/online"
adb shell "echo 1 > /sys/devices/system/cpu/cpu6/online"
adb shell "echo 1 > /sys/devices/system/cpu/cpu7/online"

cpufreq performance

adb shell "echo performance > /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor"

gpu performance

adb shell stop mpdecision
adb shell "echo 0 > /sys/class/kgsl/kgsl-3d0/min_pwrlevel"
adb shell "echo 0 > /sys/class/kgsl/kgsl-3d0/max_pwrlevel"
adb shell "echo 1 > /sys/class/kgsl/kgsl-3d0/force_rail_on"
adb shell "echo 1 > /sys/class/kgsl/kgsl-3d0/force_clk_on"
adb shell "echo 1 > /sys/class/kgsl/kgsl-3d0/force_bus_on"
adb shell "echo 10000000 > /sys/class/kgsl/kgsl-3d0/idle_timer"
adb shell "echo performance > /sys/class/kgsl/kgsl-3d0/devfreq/governor"

ddr performance

adb shell "echo performance >/sys/class/devfreq/*/governor”

总结

Perflock通过在需要时锁定和控制处理器的性能状态,帮助设备在高性能和低功耗之间找到平衡,提升用户体验和设备效率。这项技术对于需要高性能的应用尤其重要,但也需要谨慎使用,以避免不必要的功耗增加。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/744927.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue3+TS从0到1手撸后台管理系统

1.路由配置 1.1路由组件的雏形 src\views\home\index.vue(以home组件为例)1.2路由配置 1.2.1路由index文件 src\router\index.ts //通过vue-router插件实现模板路由配置 import { createRouter, createWebHashHistory } from vue-router import { constantRoute } from ./rou…

黑盒测试用例设计方法三

一、正交实验法 1)正交法原理介绍1、日本人,统计学家提出的 2、使用的工具:正交表 3、统计和分析实验数据,从大量实验中找到合适的实验数据组合(原本用于工业生产的数据组合与实验室的数据挑选) 4、从大量的试验组合中,挑选出一部分具有代表性的点,进行实验,分析数据。…

需求流程之产品愿景和用户画像

1.产品愿景: 羽毛球比赛计分程序旨在为各类羽毛球赛事提供高效、准确且便捷的计分解决方案,提升比赛的组织效率和公正性,同时为运动员、裁判、观众和赛事组织者带来优质的体验。2.用户画像

荣耀折叠,太卷啦

又薄又强,只缺“杀手”……近日的Magic旗舰新品发布会上,荣耀一口气带来了两款新折叠屏旗舰新品——荣耀Magic V3和荣耀Magic Vs3。 荣耀总裁赵明一如既往地自信,向大家一一阐述在折叠屏领域近百亿元研发投入换来的种种“奇迹”:创行业纪录的轻薄,青海湖电池加持,航天特种…

使用 GitHub 跟踪博文数据,并自动同步到 cnblogs

本文将说明如何使用 GitHub 跟踪博文数据并自动同步到 cnblogs 的方法,并做相关的个人使用心得分享导读 开通了博客园的 VIP 发现了会员服务中的 GitHub 跟踪和同步博文数据的功能,测试发现习惯使用 GitHub 的话,这个还是一个挺不错的功能。 本文主要分两部分,一是介绍说明…

极值理论 EVT、POT超阈值、GARCH 模型分析股票指数VaR、条件CVaR:多元化投资组合预测风险测度分析|附代码数据

全文链接:http://tecdat.cn/?p=24182 最近我们被客户要求撰写关于极值理论的研究报告,包括一些图形和统计输出。 本文用 R 编程语言极值理论 (EVT) 以确定 10 只股票指数的风险价值(和条件 VaR) 使用 Anderson-Darling 检验对 10 只股票的组合数据进行正态性检验,并使用 …

PYTHON用时变马尔可夫区制转换(MARKOV REGIME SWITCHING)自回归模型分析经济时间序列|附代码数据

全文下载链接:http://tecdat.cn/?p=22617 最近我们被客户要求撰写关于MRS的研究报告,包括一些图形和统计输出。 本文提供了一个在统计模型中使用马可夫转换模型模型的例子,来复现Kim和Nelson(1999)中提出的一些结果。它应用了Hamilton(1989)的滤波器和Kim(1994)的平滑…

pnpm错误, ERR_PNPM_UNEXPECTED_STORE  Unexpected store location

背景ERR_PNPM_UNEXPECTED_STORE  Unexpected store locationThe dependencies at "C:\Users\acer\Code\Nuxt3\init\node_modules" are currently linked from the store at "C:\Users\acer\.hvigor\caches\v3".pnpm now wants to use the store at "…

P5537 题解

blog。今天在 XDFZ 听 ljy 讲的串串(?)题,瞎写写就混了个最优解,来发个题解(注意到树的形态不变,所以可以记录兄弟间的编号 rank。每个点就可以表示为若干 rank 构成的路径,例如下图:然后将每个点的这个路径压成 hash,记为 \(H_i\),并丢进 map 里。 假设从 \(x\) 开…

端口被占用如何处理Error: listen EADDRINUSE: address already in use :::xxxx

启动项目出现 Error: listen EADDRINUSE: address already in use :::9088yarn run v1.22.19 $ node src/index.js events.js:377throw er; // Unhandled error event^ Error: listen EADDRINUSE: address already in use :::9088at Server.setupListenHandle [as _listen2] (n…

xshell 8 关闭默认“图形化标签页”

更新 xshell 8 后,打开变成这样,不能直接输入命令很难受关闭方法: 工具 → 选项 → 高级 → 勾选“Open new tab as local shell” → 重新打开xshell 8

WPS批量将图片嵌入单元格

选中单张图片Ctrl+A全选右键选择图片嵌入单元格注意:它是将图片嵌入在图片左上角所在的单元格内,需要确保每个被嵌入的单元格只有一个图片的左上角在其内部,否则会出现“一个单元格内不能插入多个图片的”的报错