【WALT】scale_exec_time() 代码详解
代码版本:Linux4.9 android-msm-crosshatch-4.9-android12
代码展示
static inline u64 scale_exec_time(u64 delta, struct rq *rq)
{
u32 freq;
// ⑴ 将 CPU cycles 转换为 CPU 当前频率
freq = cpu_cycles_to_freq(rq->cc.cycles, rq->cc.time);
// ⑵ 归一化 delta
delta = DIV64_U64_ROUNDUP(delta * freq, max_possible_freq);
delta *= rq->cluster->exec_scale_factor;
delta >>= 10;
return delta;
}
代码逻辑:
scale_exec_time() 函数用于给任务的运行时间 delta 进行归一化。
为什么归一化?
EAS 主要针对异构 CPU 架构,如 Arm big.LITTLE,因为这种架构有不同性能和功耗的 CPU 核心,不同 CPU 的最大算力、最大频率等都不同。假定一个任务在当前窗口中运行了 5ms,对不同频率的两个 CPU 来说,5ms 带来的负载是截然不同的。
WALT 算法引入了一种类似权重的方法,根据 CPU 的频率(frequency)和 最大每周期指令数(efficiency)来对任务的运行时间进行归一化。
(注:此处 efficiency 的定义并不确定,在内核文档中出现过这个定义。)
⑴ 将 CPU cycles 转换为 CPU 当前频率
freq = cpu_cycles_to_freq(rq->cc.cycles, rq->cc.time);
static inline u32 cpu_cycles_to_freq(u64 cycles, u64 period)
{
return div64_u64(cycles, period);
}
在这里 freq = rq->cc.cycles / rq->cc.time。其中,rq->cc.cycles 和 rq->cc.time 在函数 update_task_rq_cpu_cycles() 中更新:
static void
update_task_rq_cpu_cycles

文章详细解析了Linux内核4.9版本中的scale_exec_time函数,该函数用于在big.LITTLE架构中对任务执行时间进行归一化处理。通过将CPU周期转换为当前频率并应用效率因子,确保不同性能核心间的公平比较。EAS调度器利用此归一化方法适应异构CPU架构的特性。
最低0.47元/天 解锁文章
1678

被折叠的 条评论
为什么被折叠?



