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 )