[Linux] Thermal Power allocator governor 分析

Power allocator governor 分析

PID控制算法原理图



                                      k_d
                                       |
current_temp                           |
     |                                 v
     |                +----------+   +---+
     |         +----->| diff_err |-->| X |------+
     |         |      +----------+   +---+      |
     |         |                                |      tdp        actor
     |         |                      k_i       |       |  get_requested_power()
     |         |                       |        |       |        |     |
     |         |                       |        |       |        |     | ...
     v         |                       v        v       v        v     v
   +---+       |      +-------+      +---+    +---+   +---+   +----------+
   | S |-------+----->| sum e |----->| X |--->| S |-->| S |-->|power     |
   +---+       |      +-------+      +---+    +---+   +---+   |allocation|
     ^         |                                ^             +----------+
     |         |                                |                |     |
     |         |        +---+                   |                |     |
     |         +------->| X |-------------------+                v     v
     |                  +---+                               granted performance
desired_temperature       ^
                          |
                          |
                      k_po/k_pu

PID Controller

The power allocator governor implements a
Proportional-Integral-Derivative controller (PID controller) with
temperature as the control input and power as the controlled output:

P_max = k_p * e + k_i * err_integral + k_d * diff_err + sustainable_power

温控驱动策略层主要提供API:

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,
};

解析bind_to_tz接口细节:

                power_allocator_bind
                        |
                        |
                        v
                get_governor_trips 
                        |       1:获取的到第一个passive温度值,当作switch on temp
                        |       2:获取最后一个passive温度值, 当作max_desired temp
                        v
                estimate_pid_constants
                        |       1:temperature_threshold = control_temp - switch_on_temp
                        |       2:k_po = int_to_frac(sustainable_power)/ temperature_threshold
                        |       3:k_pu = int_to_frac(2 * sustainable_power) /
                        temperature_threshold
                        |       4:k_i = int_to_frac(10) / 1000; =  10
                        |       5:此函数将k_p, k_i初始化, k_d 默认为0
                        v
                    reset_pid_controller
                        |       err_inegral设为0, prev_err设为0
                        v
                    tz->governor_data = params      将策略里面使用到的参数记录到tz

解析throttle接口代码细节:

                power_allocator_throttle
                            |
                            v
                        allocate_power     
                            |               1:输入参数为tz与control_temp
                            |               2:通过insttanse获取所有cooling dev的weight
                            |               3:通过instanse 获取到所有需求功率,最大可以持续功率,以及加权后的需求功率
                            |
                            v
                        pid_controller      
                            |               1:输入tz, 可持续最大功率,control_temp
                            |               2: sustainable power 从tz dts获取
                            |               3:err = control_temp - current_temp(tz->temp)  << 10, err即是目标温度与当前温度差值
                            |               4:p = (k_po or k_pu) * err >> 10
                            |               5:i = k_i * err_integral >> 10
                            |               6:params->err_integral += err err_integral 是所有前序err的
                            |               7:d = (k_d  * (err - prev_err)) / passive_delay diff_err是本次err减上次err
                            |               8: power_range = p + i + d + ssustainable
                            v
                        divvy_up_power
                            |               1:根据weight power 权重分配可用功率
                            v
                        power_actor_set_power
                            |               1:设置各个 cooling dev的功率
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章