【WALT】scale_exec_time() 代码详解

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

【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
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值