IPA(Intelligent PowerAllocation)是由ARM开发的符合linux内核thermalframework的governor,代码中的名字为power_allocator,旨在满足温控效果的条件下最大化性能。
熟悉ARM终端芯片系统的开发人员,应该对EAS(Energy Aware Scheduler)、Energy/Power Model不陌生,IPA正是这种能效思想在温控领域的体现。基于如下理论:
因此,可以通过控制功耗达到控制温度的目的,通过在各个IP Core间合理分配功耗可以最大化温控下的性能表现。基于上述理论,IPA实现包含了两大核心功能:基于PID的温度闭环控制器、Power Allocator(PA)。
为了更好的说明IPA的开发目的,这里以CPU上常使用的step-wise governor作对比,看看传统governor的优点及不足。
作为CPU温控常用的governor,step-wise在温控管理上有着良好的表现。Step-wise将温度趋势分为三种:上升、下降、稳定,根据配置的温度触发点(TripPoint)及温度趋势以步进的方式调节CPU的状态,具体来讲就是调节频率。比如温度已经超过触发点同时温度处于上升状态,则step-wise就会将CPU的coolingstate上调一级(对应操作是频率降低),然后继续轮询CPU的温度,通过判断温度趋势再执行相应动作。
上述过程至少存在两个缺点:
1)该控制属于开环控制,step-wise只是根据配置及温度趋势机械地进行步进调节,它并不关心此次的调节动作是否能够达到温控的目的。
2)Step-wise直接控制CPU的频率,在温度及其趋势确定的情况下,则相应的CPU频率也就确定,这对于性能会产生不利影响,特别是移动终端系统上极短时间的性能提升对温升影响较小,但能更好的改善性能体验。
IPA实现了闭环控制,通过闭环调节使得升温时温度可以稳定在目标温度处,提高控制精度。
IPA实现了多个IP core之间Power的动态分配,实现资源的优化配置。以小核、大核、GPU为控制对象来讲,即使温度已经达到目标温度,但是根据各个小核、大核、GPU的负载情况,最需要性能的处理器仍然有可能跑到最高频率,这种基于负载的power动态分配策略对性能比较友好。
当温度超过Tswitch_on时,IPA governor开始工作,通过PID controller闭环控制,使温度能够稳定在Ttarget,并尽可能减少波动,实现预期的温度控制目标。当整体温度下降到Tswitch_on时,IPA governor停止工作。
对于IPA来讲,主要的输入为温度和各个Core的性能需求。温度可以来自SOC,也可以来自板温,IPA把采集温度与目标控制温度的温差作为控制输入。各个IP Core的性能需求是通过当前的负载来计算的,然后利用OPP(Operating Performance Point)及EM(Energy Model)转换为Power Request作为IPA的输入。而IPA的输出是PowerGranted,然后再通过OPP及EM转换为性能指标(比如最大运行频率)。如此的循环往复最终实现对硬件的温度控制。
IPA governor包含两个核心功能PID温度控制器和PA(Power Allocator)。PIDController实现PID闭环控制,用于温度的跟踪控制。PowerAllocator实现基于核心负载的Power Budget分配。
PID( Proportional Integral Derivative)控制即比例积分微分控制,是最早发展起来的控制策略之一,由于其算法简单、鲁棒性好和可靠性高,被广泛应用于工业过程控制,尤其适用于可建立精确数学模型的确定性控制系统。PID控制属于闭环控制。IPA的PID Controller其控制输入为目标温度与当前温度的差值e,通过比例、积分、微分计算累加求和后再与sustainable_power相加即为当前温度下允许的最大功耗值。Sustainable_power是指在保证满足目标温度target_temerature的条件下所允许的最大功耗值。PIDcontroller的控制函数可以表示为如下公式:
其中,
比例项能够提高系统的响应速度和稳态精度,但是过大的比例控制容易导致系统超调和振荡,且单纯的比例控制无法消除系统的稳态误差。kp对控制偏差e起到线性缩放的作用。
IPA关于比例项系数给出两个值kpu和kpo,kpu当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负责将PID Controller计算出的Power在各个Cooling device进行分配。分配基于Cooling device需求的功耗Prequest_i、cooling device的权重Wi进行。
首先,计算所以cooling device需求功耗的加权和:
然后,计算各个cooling device按权重应该分得的power:
但是如果某个cooling device获取的Pgranted_i 大于该cooling device实际支持的最大功耗Pmax_i,则其最多只能获取Pmax_i,这样就多分配了Pextra_i = Pgranted_i — Pmax_i,累计所有多分配的power:
最后再将Pextra进行再分配,分配的权重为Wextra_i =
那么再分配得到的功耗Pextra_granted_i= Wextra_i * Pextra
最终每个cooling device所得到的Power为Pgranted_i + Pextra_granted_i。
对于每个IP core其功耗可以分为静态功耗、动态功耗。以CPU来讲,静态功耗由工艺制程、面积、电压、温度、静态管类型等等因素决定,在较新的内核(cpucooling device)已经不再将静态功耗计入Prequest_i。那么Prequest_i则主要由动态功耗及CPU的负载决定:
Prequest_i = Pdynamic_i* Load / 100
由于Linux Kernel4.2之后的版本已经开始支持IPA了,这样就省去了从ARM移植IPA代码的工作量。现在只需要用户自己实现thermal sensor的驱动以提供温度和在dts中配置thermal zone这两项工作。
IPA gover代码路径:/drivers/thermal/power_allocator.c
与其他thermal governor的对dts的配置要求不同,IPA governor新增了sustainable-power属性;需要提供两个类型为passive的trip point分别作为IPA的起控温度Tswitch_on和目标温度Ttarget;需要为每个cooling device指定权重w即dts里contribution属性;当然thermal zone的governor需要配置为power_allocator。
本文主要分析了IPA的两个核心功能及dts配置,虽然目前使用IPA相对简单,但是在实际运用上会有不少的问题,PID参数的调节、是否能够实现真正的闭环、power如何分配等等,这些都需要大量的实验来调节验证温控效果。