CPU空闲冷却

情况:

在某些情况下,SoC可能会达到临界温度限制,并且无法将温度稳定在温度控制附近。当SoC必须稳定温度时,内核可以对冷却设备采取措施以减轻功耗。当达到临界温度时,必须做出降低温度的决定,这反过来会影响性能。

另一种情况是,即使通过时钟门控组件将动态泄漏降低到最低限度后,硅温度仍继续升高。 由于静态泄漏,这种失控现象可能会继续发生。 唯一的解决方案是关闭组件电源,从而降低动态和静态泄漏,从而使组件冷却下来。

最后但并非最不重要的一点是,系统可以要求特定的功率预算,但是由于OPP密度,我们只能选择功率预算低于所请求功率预算的OPP,并且未充分利用CPU,从而损失了性能。 换句话说,一个OPP以低于请求的功率预算的功率来欠利用CPU,而下一个OPP超过了功率预算。 如果存在中间OPP,则可以使用它。

解决方案:

如果我们可以在受控时间内消除特定持续时间的静态和动态泄漏,则SoC温度将降低。 通过作用于空闲状态持续时间或空闲周期注入周期,我们可以通过调节功率预算来减轻温度。

工作性能点(OPP)密度对cpufreq的控制精度有很大影响,但是不同的供应商具有大量的OPP密度,并且某些OPP之间的功率差距很大,这会导致热控制期间的性能损失和其他情况下的功率损失。

在特定的OPP上,我们可以假设在属于同一群集的所有CPU上注入空闲周期,其持续时间大于群集空闲状态目标驻留时间,从而导致在此期间内静态和动态泄漏下降(模输入此状态所需的能量)。 因此,具有空闲周期的可持续功率与OPP的可持续功率具有线性关系,并且可以使用类似于以下的系数进行计算

Power(IdleCycle) = Coef x Power(OPP)

空闲注入:

空闲注入的基本概念是强制CPU在每个控制周期中进入指定的空闲状态,除了cpufreq之外,它还提供了另一种控制CPU功率和热量的方法。 理想情况下,如果属于同一群集的所有CPU同步注入其空闲周期,则该群集可以达到其断电状态,从而最大程度地降低功耗,并将静态泄漏降低到几乎为零。 但是,这些空闲周期注入会增加额外的延迟,因为CPU必须从深度睡眠状态唤醒。

我们使用固定的空闲注入持续时间,该持续时间可带来可接受的性能损失和固定的延迟。 可以通过调节空闲注入的占空比来增加或减少缓解措施。

^
|
|
|-------                         -------
|_______|_______________________|_______|___________

<------>
  idle  <---------------------->
               running

 <----------------------------->
         duty cycle 25%

冷却设备的实现基于占空比百分比的状态数。 当没有进行缓解时,冷却设备的状态为零,这意味着占空比为0%。

当缓解开始时,根据调速器的策略,选择一个起始状态。 通过固定的空闲持续时间和占空比(也称为冷却设备状态),可以计算运行持续时间。

调速器将更改冷却设备的状态,因此占空比也会随之变化,并且这种变化会调节冷却效果。

^
|
|
|-------                 -------
|_______|_______________|_______|___________

<------>
  idle  <-------------->
           running

 <--------------------->
     duty cycle 33%


^
|
|
|-------         -------
|_______|_______|_______|___________

<------>
  idle  <------>
         running

 <------------->
  duty cycle 50%

空闲注入持续时间值必须符合以下约束

  • 它小于或等于缓解开始时我们容忍的延迟。 它与平台有关,并且将取决于我们想要的用户体验,反应性与性能之间的权衡。 应指定此值。

  • 它大于我们想要进行热缓解的空闲状态的目标驻留时间,否则最终会消耗更多的能量。

功率注意事项

当我们达到热跳闸点时,我们必须在特定温度下维持特定的功率,但此时我们消耗

Power = Capacitance x Voltage^2 x Frequency x Utilisation

...这超过了可持续功率(或者系统设置中存在问题)。 “电容”和“利用率”是一个固定值,“电压”和“频率”是人为固定的,因为我们不想更改OPP。 我们可以将“电容”和“利用率”分组为一个术语,即“动态功率系数(Cdyn)”简化上述公式,我们有

Pdyn = Cdyn x Voltage^2 x Frequency

功率分配器调速器将以某种方式要求我们降低功率,以便以设备树中定义的可持续功率为目标。 因此,通过空闲注入机制,我们希望平均功率(Ptarget)导致在特定OPP上以全功率运行一定的时间,而在另一段时间内空闲。 可以将其放入方程式

P(opp)target = ((Trunning x (P(opp)running) + (Tidle x P(opp)idle)) /
                       (Trunning + Tidle)

 ...

Tidle = Trunning x ((P(opp)running / P(opp)target) - 1)

在这一点上,如果我们知道CPU的运行时间,那么就可以得到所需的空闲注入。 或者,如果我们有空闲注入持续时间,则可以使用以下公式计算运行持续时间

Trunning = Tidle / ((P(opp)running / P(opp)target) - 1)

实际上,如果运行功率小于目标功率,最终我们将获得负时间值,因此显然方程式的使用仅限于降低功率,因此需要更高的OPP才能使运行功率大于目标功率。

但是,在此演示中,我们忽略了三个方面

  • 此处未定义静态泄漏,我们可以在等式中引入它,但假设大多数情况下它将为零,因为很难从SoC供应商那里获得值

  • 未考虑空闲状态唤醒延迟(或进入+退出延迟),必须将其添加到方程式中才能严格计算空闲注入

  • 注入的空闲持续时间必须大于空闲状态目标驻留时间,否则最终会消耗更多的能量,并可能反转缓解效果

因此,最终方程式为

Trunning = (Tidle - Twakeup ) x
               (((P(opp)dyn + P(opp)static ) - P(opp)target) / P(opp)target )