高通Perflock
高通的Perflock是Qualcomm公司开发的一项技术,用于优化设备性能和功耗管理。Perflock是一种锁定机制,允许操作系统或应用程序在需要时对处理器的性能状态进行控制,从而确保在关键任务或高性能需求的情况下,处理器能够维持在高性能状态。
主要功能和特点
性能锁定:Perflock允许应用程序或系统服务锁定CPU的频率或性能状态,以满足高性能需求。例如,在运行高性能游戏或进行繁重的计算任务时,可以使用Perflock确保CPU保持在高频率下运行。
功耗管理:在不需要高性能时,Perflock可以解除锁定,允许处理器降低频率,从而节省电量并降低功耗。
灵活性:开发者可以通过API接口使用Perflock,根据具体需求动态调整处理器的性能状态。
兼容性:Perflock主要应用于搭载Qualcomm处理器的设备,如智能手机和平板电脑。
应用场景
- 游戏:在运行大型3D游戏时,使用Perflock可以确保游戏流畅运行,不会因为处理器降频而影响用户体验。
- 多媒体处理:在视频编辑或其他多媒体处理应用中,Perflock可以提高处理速度和效率。
- 系统任务:系统更新或备份等任务需要长时间高性能运行时,Perflock可以提供必要的性能支持。
如何使用高通perflock
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_CAMERA
perfLockParamsOpenCamera,
sizeof(perfLockParamsOpenCamera) / sizeof(INT32)
},
perfLockParamsOpenCamera定义为:
static INT32 perfLockParamsOpenCamera[] =
{
// Disable power collapse and set CPU clocks to turbo
MPCTLV3_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 turbo
MPCTLV3_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
#关闭perflock 和 thermal的影响
adb shell stop perf-hal-1-0
adb shell stop perf-hal-2-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通过在需要时锁定和控制处理器的性能状态,帮助设备在高性能和低功耗之间找到平衡,提升用户体验和设备效率。这项技术对于需要高性能的应用尤其重要,但也需要谨慎使用,以避免不必要的功耗增加。
高通Perflock的更多相关文章
- GJM : Unity3D 高通Vuforia SDK AR 开发
一.AR概念: 增强现实(Augmented Reality,简称AR),是在虚拟现实的基础上发展起来的新技术,也被称之为混合现实.是通过计算机系统提供的信息增加用户对现实世界感知的技术,将虚拟的信息 ...
- 高通vuforia+Unity3D 制作ar app
很简单就可以用Unity3D做出增强现实的一个小例子 新人第一次写博客,若出现错误望指正^_^ 需要下载de东西: unity3d 5.0 http://unity3d.com/get-unity ...
- android 6.0 高通平台sensor 工作机制及流程(原创)
最近工作上有碰到sensor的相关问题,正好分析下其流程作个笔记. 这个笔记分三个部分: sensor硬件和驱动的工作机制 sensor 上层app如何使用 从驱动到上层app这中间的流程是如何 Se ...
- 高通AR和友盟SDK的AndroidManifest.xml合并
高通AR和友盟SDK的AndroidManifest.xml合并 因为高通的AR在android中一开始就要启动,所有主Activity要设置为高通的Activity,即android:name=&q ...
- 高通平台FastMMI(FFBM模式)简介与进入方法
参考: http://blog.csdn.net/tfslovexizi/article/details/51499979 http://www.voidcn.com/blog/jimbo_lee/a ...
- 小米手机(HM1SW)高通开发android程序全过程
小米手机(HM1SW)开发android程序全过程 修改历史: 2016年5月9日 -------- 整理文档 a.增加了手机基本信息. b.增加360手机助手连接说明 2016年2月26日 - ...
- 针对高通BMS的研究 高通电量计
点击打开链接 高通8064 8974 8926等pm芯片都集成了电量计,估计后续芯片都会一直存在,现在许多项目UI状态栏电池都有百分比显示,所以需要深入分析BMS有助于解决电量方面的BUG. 一: S ...
- 高通、猎户机型Android典型bootloader分析
1.bootloader是什么? 简单地说,bootloader 就是在操作系统内核运行之前运行的一段小程序.通过这段小程序,我们可以初始化硬件设备.建立内存空间的映射图,从而将系统的软硬件环境带到一 ...
- 高通平台 lcd driver 调试小结
一.概述 1.1 简介 本文档主要包括LCD模块的驱动流程分析.Framebuffer相关知识.Gralloc等相关内容,以及LCD调试的一些经验和相关bug的分析和讲解. 1.2 开发环境 And ...
- 高通平台msm8909 LK 实现LCD 兼容
前段时间小米出现红米note2 换屏门,现在我们公司也要上演了:有两个供应商提供不同IC 的LCD panel. 软件区分的办法是读取LCD IC 的ID 寄存器,下面解析高通平台LK中LCD兼容的过 ...
随机推荐
- Microsoft Dynamics CRM 365/2016 配置POP3/STMP邮箱(附例)
前期准备: 必须支持pop3/stmp的邮箱 以下用网易163邮箱做的测试,注意开通了独立安全码,非邮箱登录密码 1.打开设置>>电子邮件配置 2.新建电子邮件配置 pop3/smtp 3 ...
- excel一次性粘贴2万行数据
测试导入文件功能中,会出现需要验证导入大批量数据文件的情况,怎么样让文件快速从1行数据变成2万行数据呢,以下讲解方法: 1.如下原文件只有2行数据,第一行是标题第二行是数据 2. 选中需要复制的第二行 ...
- 【Vue2】Computed 计算属性
计算属性在编写的时候是一个方法 但是在调用的时候作为属性使用 <!DOCTYPE html> <html lang="en"> <head> & ...
- 【SpringMVC】05 RestFul风格
什么是RestFul风格? 一个资源定位和资源操作的风格,不是标准,也不是协议, 基于此风格的路径访问可以隐藏真实的参数传递,以提高网站的安全访问 以往的请求参数: jdbc:mysql://loca ...
- 如果美国断供中国所有的Intel和AMD芯片,国内各行各业会不会崩溃
说一个我个人观点,我认为如果国内完全没有X86芯片的供应,那么各行各业的发展会明显进入发展迟缓阶段,首先受影响的就是软件开发领域,因为没有新的芯片也就意味着袋电脑性能停滞或者倒退,那么开发出新的更耗资 ...
- 并行化强化学习 —— 初探 —— 并行reinforce算法的尝试 (中篇:强化学习在大规模仿真环境下单步交互并行化设计的可行性)
本篇博客是前篇博客并行化强化学习 -- 初探 -- 并行reinforce算法的尝试 (上篇:强化学习在多仿真环境下单步交互并行化设计的可行性)的继续,文中代码地址为:https://gitee.co ...
- MindSpore 建立神经网络
代码原地址: https://www.mindspore.cn/tutorial/zh-CN/r1.2/model.html 建立神经网络: import mindspore.nn as nn cla ...
- 使用tensorbaoardx报错——Descriptors cannot not be created directly. If this call came from a _pb2.py file, your generated code is out of date and must be regenerated with protoc >= 3.19.0.
运行代码报错: from tensorboardX import SummaryWriter 报错内容: 发生异常: TypeError Descriptors cannot not be creat ...
- 洛谷P1209修理牛棚 Barn Repair
[USACO1.3] 修理牛棚 Barn Repair 题目描述 在一个月黑风高的暴风雨夜,Farmer John 的牛棚的屋顶.门被吹飞了 好在许多牛正在度假,所以牛棚没有住满. 牛棚一个紧挨着另一 ...
- B站基于Apache DolphinScheduler的一站式大数据集群管理平台(BMR)初窥
一.背景 大数据服务是数据平台建设的基座,随着B站业务的快速发展,其大数据的规模和复杂度也突飞猛进,技术的追求也同样不会有止境. B站一站式大数据集群管理平台(BMR),在千呼万唤中孕育而生.本文简单 ...