深入浅出理解Linux thermal governor之IPA

IPA(Intelligent PowerAllocation)是由ARM开发的符合linux内核thermalframework的governor,代码中的名字为power_allocator,旨在满足温控效果的条件下最大化性能。

IPA背景

熟悉ARM终端芯片系统的开发人员,应该对EAS(Energy Aware Scheduler)、Energy/Power Model不陌生,IPA正是这种能效思想在温控领域的体现。基于如下理论:

  • SoC的温度与功耗成正相关,功耗越高则温度越高
  • Soc的功耗主要由其上的IP Core(CPU、GPU等)消耗

因此,可以通过控制功耗达到控制温度的目的,通过在各个IP Core间合理分配功耗可以最大化温控下的性能表现。基于上述理论,IPA实现包含了两大核心功能:基于PID的温度闭环控制器、Power Allocator(PA)。

为什么需要IPA governor

为了更好的说明IPA的开发目的,这里以CPU上常使用的step-wise governor作对比,看看传统governor的优点及不足。

Step-wise governor

作为CPU温控常用的governor,step-wise在温控管理上有着良好的表现。Step-wise将温度趋势分为三种:上升、下降、稳定,根据配置的温度触发点(TripPoint)及温度趋势以步进的方式调节CPU的状态,具体来讲就是调节频率。比如温度已经超过触发点同时温度处于上升状态,则step-wise就会将CPU的coolingstate上调一级(对应操作是频率降低),然后继续轮询CPU的温度,通过判断温度趋势再执行相应动作。

上述过程至少存在两个缺点:

1)该控制属于开环控制,step-wise只是根据配置及温度趋势机械地进行步进调节,它并不关心此次的调节动作是否能够达到温控的目的。

2)Step-wise直接控制CPU的频率,在温度及其趋势确定的情况下,则相应的CPU频率也就确定,这对于性能会产生不利影响,特别是移动终端系统上极短时间的性能提升对温升影响较小,但能更好的改善性能体验。

IPA的优点

IPA实现了闭环控制,通过闭环调节使得升温时温度可以稳定在目标温度处,提高控制精度。

IPA实现了多个IP core之间Power的动态分配,实现资源的优化配置。以小核、大核、GPU为控制对象来讲,即使温度已经达到目标温度,但是根据各个小核、大核、GPU的负载情况,最需要性能的处理器仍然有可能跑到最高频率,这种基于负载的power动态分配策略对性能比较友好。

IPA温控效果模拟

当温度超过Tswitch_on时,IPA governor开始工作,通过PID controller闭环控制,使温度能够稳定在Ttarget,并尽可能减少波动,实现预期的温度控制目标。当整体温度下降到Tswitch_on时,IPA governor停止工作。

IPA温控效果模拟

IPA简化框架

对于IPA来讲,主要的输入为温度和各个Core的性能需求。温度可以来自SOC,也可以来自板温,IPA把采集温度与目标控制温度的温差作为控制输入。各个IP Core的性能需求是通过当前的负载来计算的,然后利用OPP(Operating Performance Point)及EM(Energy Model)转换为Power Request作为IPA的输入。而IPA的输出是PowerGranted,然后再通过OPP及EM转换为性能指标(比如最大运行频率)。如此的循环往复最终实现对硬件的温度控制。

IPA简化框架

IPA功能

IPA governor包含两个核心功能PID温度控制器和PA(Power Allocator)。PIDController实现PID闭环控制,用于温度的跟踪控制。PowerAllocator实现基于核心负载的Power Budget分配。

IPA功能

PID温度控制器

PID( Proportional Integral Derivative)控制即比例积分微分控制,是最早发展起来的控制策略之一,由于其算法简单、鲁棒性好和可靠性高,被广泛应用于工业过程控制,尤其适用于可建立精确数学模型的确定性控制系统。PID控制属于闭环控制。IPA的PID Controller其控制输入为目标温度与当前温度的差值e,通过比例、积分、微分计算累加求和后再与sustainable_power相加即为当前温度下允许的最大功耗值。Sustainable_power是指在保证满足目标温度target_temerature的条件下所允许的最大功耗值。PIDcontroller的控制函数可以表示为如下公式:

PID温度控制器

其中,

  • 𝑒=target𝑡𝑒𝑚𝑝𝑒𝑟𝑎𝑡𝑢𝑟𝑒−𝑐𝑢𝑟𝑟𝑒𝑛𝑡𝑡𝑒𝑚𝑝𝑒𝑟𝑎𝑡𝑢𝑟𝑒

  • 𝑖𝑛𝑡𝑒𝑔𝑟𝑎𝑙𝑒𝑟𝑟 is the sum of previous errors

  • 𝑑𝑖𝑓𝑓𝑒𝑟𝑟=𝑒−𝑝𝑟𝑒𝑣𝑖𝑜𝑢𝑠𝑒𝑟𝑟𝑜𝑟

比例控制项

比例项能够提高系统的响应速度和稳态精度,但是过大的比例控制容易导致系统超调和振荡,且单纯的比例控制无法消除系统的稳态误差。kp对控制偏差e起到线性缩放的作用。

IPA关于比例项系数给出两个值kpukpokpu当Tcurr低于 Ttarget该参数进行计算,反之使用kpo进行计算,默认计算公式如:

kpu = (2 * sustainable_power) / (Ttarget – Tswitch_on)

kpo = (sustainable_power) / (Ttarget – Tswitch_on)

单独考虑比例项,或略积分、微分项对power的控制效果如图:

比例控制项

积分控制项

积分项是对温差e累计,积分控制项能够启动消除稳态误差的作用,但也可能带来如积分饱和等现象。

IPA关于积分项系数ki默认计算公式如:

Ki = int_to_frac(10) / 1000

微分控制项

积分项是温差e的变化趋势,具一定预测效果,可以减少超调量,提高温控稳定性。

IPA关于微分项系数kd默认值为0,即默认不考虑微分项。

Power Allocator

Power Allocator负责将PID Controller计算出的Power在各个Cooling device进行分配。分配基于Cooling device需求的功耗Prequest_i、cooling device的权重Wi进行。

首先,计算所以cooling device需求功耗的加权和:

Power Allocator

然后,计算各个cooling device按权重应该分得的power:

Power Allocator

但是如果某个cooling device获取的Pgranted_i 大于该cooling device实际支持的最大功耗Pmax_i,则其最多只能获取Pmax_i,这样就多分配了Pextra_i = Pgranted_i — Pmax_i,累计所有多分配的power:

Power Allocator

最后再将Pextra进行再分配,分配的权重为Wextra_i =Power Allocator

那么再分配得到的功耗Pextra_granted_i= Wextra_i * Pextra

最终每个cooling device所得到的Power为Pgranted_i + Pextra_granted_i。

Power Allocator

关于Prequest_i

对于每个IP core其功耗可以分为静态功耗、动态功耗。以CPU来讲,静态功耗由工艺制程、面积、电压、温度、静态管类型等等因素决定,在较新的内核(cpucooling device)已经不再将静态功耗计入Prequest_i。那么Prequest_i则主要由动态功耗及CPU的负载决定:

Prequest_i = Pdynamic_i* Load / 100

如何使用IPA

由于Linux Kernel4.2之后的版本已经开始支持IPA了,这样就省去了从ARM移植IPA代码的工作量。现在只需要用户自己实现thermal sensor的驱动以提供温度和在dts中配置thermal zone这两项工作。

代码路径

IPA gover代码路径:/drivers/thermal/power_allocator.c

关于DTS配置

与其他thermal governor的对dts的配置要求不同,IPA governor新增了sustainable-power属性;需要提供两个类型为passive的trip point分别作为IPA的起控温度Tswitch_on和目标温度Ttarget;需要为每个cooling device指定权重w即dts里contribution属性;当然thermal zone的governor需要配置为power_allocator。

关于DTS配置

IPA总结

本文主要分析了IPA的两个核心功能及dts配置,虽然目前使用IPA相对简单,但是在实际运用上会有不少的问题,PID参数的调节、是否能够实现真正的闭环、power如何分配等等,这些都需要大量的实验来调节验证温控效果。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程