IPA(Intelligent Power Allocator)模型的核心是利用PID控制器,Thermal Zone的温度作为输入,可分配功耗值作为输出,调节Allocator的频率和电压值。

由Power Management一般开发模型可知,包括模型建立,模型实现,验证。

1 IPA模型

PID控制器在Sustainable Power基础上,根据当前温度和Control Temp之间的差值,来调节可分配功耗值的大小,进而调节Cooling设备的状态,也即调整OPP(Voltage和Frequency组合)。

所谓Sustainable Power是在不同OPP情境下,某一个最大OPP的温度保持基本稳定。比其大者,温度上升明显;比其小者温度保持不变或者下降。这可以通过监测不同OPP对应的温度值,得到一个Sustainable Power。

另一个就是根据当前环境预估下一个场景功耗值。一般认为包括两部分Dynamic Power和Static Leakage,这是由实测过程中得出的经验。Dynamic Power可以认为跟Voltage和Frequency相关;Static Leakage跟Voltage和Temperature有关。根据实测得到的数据,进行分析得到最吻合数据的一组算式。由于的HiKey实测中,Static Leakage比较小,就被忽略了。所以最终Power值就只跟Voltage和Frequency相关,据此就可以算出OPP对应的功耗值。OPP和功耗之间就建立了联系。

在一个重要参数就是PID控制器的参数P、I、D的确定,这部分也存在一定的经验值。需要测试几组不同参数,然后看温度控制效果。

2 IPA测试环境

1. 在最靠近CPU的地方引出测试点。

2. 接出Ground、V+、V-到ARM Energy Probe。

3. 通过软件设置特殊状态:

1. 对于sustainable power需要将8核跑在100%workload。

2. 对于测试Cluster Power和CPU Power就比较复杂,下面单列。

4. 使用Ipython脚本读取Thermal Zone温度和测试点功耗。

HiKey对应的Cluster和CPU功耗状态如下:

Power State

PD_CPUx/CLKIN

PDCORTEXA53

PD_L2

LinuxKernel

CPU

CPU P-State

On

On

On

P-State

WFI

On, internal clock gating

On

On

C-State

CPU Off

Off

On

On

C-State

Cluster

Cluster P-State

On or Off

On

On

P-State

Cluster L2 Retention

Off

Off

Retention

C-State

Cluster Off

Off

Off

Off

C-State

图表 1 HiKey Cluster和CPU状态

3 IPA重要参数

sustainable-power

OPP(MHz)

Sustainable power

729

2155

960

3326

1200

5285

图表 2 Sustainable power

sustainable-power在thermal-zone里面,是因为测量的温度是基于thermal-sensors的,然后每个thermal-zone包含若干trips和cooling-maps。

通过观察温度,在729MHz的时候温度不会增加,在960MHz的时候温度缓慢增加,在1200MHz的时候温度增加很快。所以确定sustainable-power在960MHz。

在Thermal框架中有一个work queue会去轮询thermal_zone_device_check,根据Trip类型不同会执行不同的delay,passive模式100ms,其他1000ms。

control_temp

IPA模型有两个温度参数很重要,当温度低于65C的时候IPA处于关闭模式,reset PID控制器。当温度高于65C,IPA开始起作用;75C是IPA的control_temp,也即高于75C,IPA就会考虑降低可分配功耗,以达到降低温度的目的。

图表 3 Thermal Zones DTS

对于cooling-maps,需要上下两张图结合理解。trip表示在target开始启动cooling;contribution是针对对个Allocator进行权重分配;cooling-device参数是<设备 min max>。这里面设置的min和max需要在cooling-min-level和cooling-max-level之间。cpufreq会将对应值转换成OPP对应的voltage和frequency进行设置。

dynamic-power-coefficient

echo 0 > /sys/devices/system/cpu/cpu[1…7]/online,关闭CPU1-CPU7,只保留CPU0。

echo mem > /sys/power/state,通过对内核代码hack使SoC相对于CPU0工作状态,逐渐关闭CPU0,Cluster0,整个SoC。得到如下数据:

OPP(MHz)

Voltage(V)

Cluster Power Off State (mW)

Cluster P-State (mW)

Cluster Power (mW)

CPU WFI (mW)

CPU P-State (mW)

CPU Dynamic Power(mW)

208

1.04

344

360

16

379

429

69

432

1.04

345

374

29

387

498

124

729

1.09

346

393

47

408

617

224

960

1.18

352

427

75

442

794

367

1200

1.33

367

479

112

508

1149

670

图表 4 HiKey功耗测试数据

功耗计算公式:

power = dyn_coeff * (freq * volt^2) + static_coeff * F(volt) * F(Temp)

Dynamic power = capacitance * (freq * volt^2)

Cluster model

         
           

Freq

Voltage

F * V^2

Power

Model power

Zero model

208

1.04

224.9728

16

16

12

432

1.04

467.2512

29

29

25

729

1.09

866.1249

47

49

47

960

1.18

1336.704

75

73

72

1200

1.33

2122.68

112

113

115

           
 

Gradient (capacitance)

Intercept (staic power)

     

Linear regression

0.051

4.716716513

     

L.R. thru zero

0.054

0

     

图表 5 Cluster系数计算

图表 6 Cluster线性图表

CPU model

         
           

Freq

Voltage

F * V^2

Power

Model power

Zero model

208

1.04

224.9728

69

44

67

432

1.04

467.2512

124

121

139

729

1.09

866.1249

224

247

258

960

1.18

1336.704

367

396

399

1200

1.33

2122.68

670

645

633

           
 

Gradient (capacitance)

Intercept (staic power)

     

Linear regression

0.317

-27.12625497

     

L.R. thru zero

0.298

0

     

图表 7 CPU功耗系数计算

图表 8 CPU线性图标

由以上Cluster和CPU的coefficient得到,dynamic-power-coefficient = (0.298 + (0.054/4 CPUs)) * 1000 = 311。

LINEST:使用最小二乘法对已知数据进行最佳直线拟合,然后返回描述此直线的数组。

LINEST(known_y's,known_x's,const,stats)

Known_y's 是关系表达式 y = mx + b 中已知的 y 值集合。

如果数组 known_y's 在单独一列中,则 known_x's 的每一列被视为一个独立的变量。

如果数组 known_y's 在单独一行中,则 known_x's 的每一行被视为一个独立的变量。

Known_x's 是关系表达式 y = mx + b 中已知的可选 x 值集合。

数组 known_x's 可以包含一组或多组变量。如果仅使用一个变量,那么只要 known_x's 和 known_y's 具有相同的维数,则它们可以是任何形状的区域。如果用到多个变量,则 known_y's 必须为向量(即必须为一行或一列)。

如果省略 known_x's,则假设该数组为 {1,2,3,...},其大小与 known_y's 相同。

Const 为一逻辑值,用于指定是否将常量 b 强制设为 0。

如果 const 为 TRUE 或省略,b 将按正常计算。

如果 const 为 FALSE,b 将被设为 0,并同时调整 m 值使 y = mx。

Stats 为一逻辑值,指定是否返回附加回归统计值。

如果 stats 为 TRUE,则 LINEST 函数返回附加回归统计值,这时返回的数组为 {mn,mn-1,...,m1,b;sen,sen-1,...,se1,seb;r2,sey;F,df;ssreg,ssresid}。

如果 stats 为 FALSE 或省略,LINEST 函数只返

4 IPA实现

static struct thermal_governor thermal_gov_power_allocator = {

.name = "power_allocator",

.bind_to_tz = power_allocator_bind,

.unbind_from_tz = power_allocator_unbind,

.throttle = power_allocator_throttle,

};

static int power_allocator_bind(struct thermal_zone_device *tz)

Power Allocator的结构体,包括三个核心函数power_allocator_bind、power_allocator_unbind、power_allocator_throttle。

初始化PID控制器的参数并且将power_allocator_params绑定到tz->governor_data。

struct power_allocator_params {

bool allocated_tzp;

s64 err_integral; //accumulated error in the PID controller

s32 prev_err; //error in the previous iteration of the PID controller

int trip_switch_on; //first passive trip point of the thermal zone. The governor switches on when this trip point is crossed.

int trip_max_desired_temperature; //last passive trip point of the thermal zone. The temperature we are controlling for.

};

PID参数

if (!tz->tzp->k_po || force)

tz->tzp->k_po = int_to_frac(sustainable_power) / temperature_threshold;

if (!tz->tzp->k_pu || force)

tz->tzp->k_pu = int_to_frac(2 * sustainable_power) / temperature_threshold;

if (!tz->tzp->k_i || force)

tz->tzp->k_i = int_to_frac(10) / 1000;

从DTS获得的参数可知,temperature_threshold = control_temp - switch_on_temp = 75000-65000 = 10000。

tz->tzp->k_po = int_to_frac(sustainable_power) /temperature_threshold =3326*1024/10000=340.5824

tz->tzp->k_pu = int_to_frac(2 * sustainable_power) /temperature_threshold =3326*2*1024/10000=681.1648

tz->tzp->k_i = int_to_frac(10) / 1000 = 10*1024/1000=10.24

另两个参数tz->tzp->k_d、tz->tzp->integral_cutoff默认为0。

PID控制器

图表 9 power_allocator_throttle流程

power_allocator_throttle作为IPA的调节功能,首先判断当前温度是否小于switch_on_temp。如果小于的话,就不进入PID调节,分配最大可用功耗。反之,则使用PID进行功耗分配。当PID调节一段时间后,如果温度低于switch_on_temp时,PID控制器的所有参数也会被重启,所以PID控制器也会得到纠正。

图表 10 allocate_power流程

allocate_power作为IPA的核心,遍历所有thermal_instances,获得actor数目及其权重;然后计算每个actor的max_power、weighted_req_power和所有actor的max_allocatable_power、total_weighted_req_power。

pid_controller根据control_temp、max_allocatable_power即pid参数计算出power_range作为下一次分配的功耗预算。

divvy_up_power基于weighted_req_power、max_power、num_actors、total_weighted_req_power、power_range在每个actor之间分配可用功耗,得出granted_power。

power_actor_set_power根据分配到的功耗设置cooling设备。cdev->ops->power2state将功耗值转换成cooling设备状态值,thermal_cdev_update的cdev->ops->set_cur_state对cooling进行设置。至此完成整个Thermal Zone的调节。

有几个重要的概念,thermal_instance指的是特定thermal_zone中特定trip上的cooling设备;power actor是一个功耗消耗实体,并且可进行功耗状态转换,能通过调节状态达到调节功耗的目的;actor的权重,默认是1024,如果比较重要可以增加weight值,反之可以减小。功耗分配不是基于req_power而是weighted_req_power。

IPA的缺陷:PID控制器在周期性tick环境下效果比较好,如果不规则重复则可能表现不太好,比如中断触发。

Android/Linux Thermal Governor之IPA分析与使用的更多相关文章

  1. Android/Linux Thermal框架分析及其Governor对比

    图表 1 Thermal框架 随着SoC性能的快速提升,功耗也极大提高,带来的负面影响是SoC的温度提高很快,甚至有可能造成物理损坏.同时功耗浪费也降低了电池寿命. 从上图可知,Thermal框架可以 ...

  2. Linux Thermal Framework分析及实施

    关键词:Zone.Cooling.Governor.Step Wise.Fair Share.trip等等. Linux Thermal的目的是控制系统运行过程中采样点温度,避免温度过高造成器件损坏, ...

  3. Android/Linux boot time分析优化

    如果需要优化boot time,就需要一个量化的工具来分析每个阶段的时间消耗.这种类型的优化特别适合使用基于timeline的图表,有着明显的时间顺序.要求不但能给出整个流程消耗的时间,还要能对流程进 ...

  4. Android(Linux)实时监控串口数据

    之前在做WinCE车载方案时,曾做过一个小工具TraceMonitor,用于显示WinCE系统上应用程序的调试信息,特别是在实车调试时,用于监控和显示CAN盒与主机之间的串口数据.因为需要抢占市场先机 ...

  5. Android(Linux)控制GPIO方法二

    前文<Android(Linux)控制GPIO的方法及实时性分析>主要使用Linux shell命令控制GPIO,该方法可在调试过程中快速确定GPIO硬件是否有问题,即对应的GPIO是否受 ...

  6. android 常见死机问题--log分析

    http://blog.csdn.net/fangchongbory/article/details/7645815         android 常见死机问题--log分析============ ...

  7. 转——Android应用开发性能优化完全分析

    [工匠若水 http://blog.csdn.net/yanbober 转载请注明出处.] 1 背景 其实有点不想写这篇文章的,但是又想写,有些矛盾.不想写的原因是随便上网一搜一堆关于性能的建议,感觉 ...

  8. Android 应用开发性能优化完全分析

    1 背景 其实有点不想写这篇文章的,但是又想写,有些矛盾.不想写的原因是随便上网一搜一堆关于性能的建议,感觉大家你一总结.我一总结的都说到了很多优化注意事项,但是看过这些文章后大多数存在一个问题就是只 ...

  9. 【转】Android应用开发性能优化完全分析

    http://blog.csdn.net/yanbober/article/details/48394201 1 背景 其实有点不想写这篇文章的,但是又想写,有些矛盾.不想写的原因是随便上网一搜一堆关 ...

随机推荐

  1. Vim编译器的常用使用方法与技巧

    vim操作 插入模式         命令行模式         末行模式 命令行模式  ->   插入模式 i --->   在当前光标的前一个插入 I --->   在行首插入 ...

  2. 关于webp图片格式初探

    前言 不管是 PC 还是移动端,图片一直是流量大头,以苹果公司 Retina 产品为代表的高 PPI 屏对图片的质量提出了更高的要求,如何保证在图片的精细度不降低的前提下缩小图片体积,成为了一个有价值 ...

  3. 【Qt编程】基于Qt的词典开发系列<十五>html特殊字符及正则表达式

    1.html特殊字符的显示 我们知道html语言和C语言一样也有一些特殊字符,它们是不能正常显示的,必须经过转义,在网上可以查到如何显示这些字符,如下图所示: 上图给了最常用的特殊字符的显示,下面我们 ...

  4. C++笔记018:构造函数的调用规则

      原创笔记,转载请注明出处! 点击[关注],关注也是一种美德~ 一.默认构造函数 两个特殊的构造函数 1.默认无参构造函数 当类中没有定义构造函数时,编译器默认提供一个无参构造函数,并且其函数体为空 ...

  5. 简单了解JS中的几种遍历

    忙了好一段时间,项目上线后终于有那么一点点空档期静下来整理一些问题了.当我们在开发项目的时候,用到遍历的地方肯定少不了,那么我们有那么多的遍历方法,在不同情况下用那种方法会更优雅而且还没bug呢? 首 ...

  6. [转]CAS原理

    在JDK 5之前Java语言是靠synchronized关键字保证同步的,这会导致有锁(后面的章节还会谈到锁). 锁机制存在以下问题: (1)在多线程竞争下,加锁.释放锁会导致比较多的上下文切换和调度 ...

  7. TensorFlow学习记录(一)

    windows下的安装: 首先访问https://storage.googleapis.com/tensorflow/ 找到对应操作系统下,对应python版本,对应python位数的whl,下载. ...

  8. 电商网站开发记录(三) Spring的引入,以及配置详解

    1.web.xml配置注解<?xml version="1.0" encoding="UTF-8"?><web-app xmlns:xsi=& ...

  9. 布局 android

    1.线性布局 LinearLayout又称作线性布局,是一种非常常用的布局.通过android:orientation属性指定了排列方向是vertical还是horizontal. 如果LinearL ...

  10. POP3和imap

    POP3 POP3是Post Office Protocol 3的简称,即邮局协议的第3个版本,是TCP/IP协议族中的一员(默认端口是110).本协议主要用于支持使用客户端远程管理在服务器上的电子邮 ...