cpu_scale/max_freq_scale/cpu_capacity/cpu_capacity_orig的含义

  • cpu_scale的意义

49 		CPU0: cpu@0 {
50 			device_type = "cpu";
51 			compatible = "arm,cortex-a55";
52 			reg = <0x0 0x0>;
53 			enable-method = "psci";
54 			cpu-idle-states = <&CORE_PD>;
55 			cpufreq-data-v1 = <&cpufreq_cluster0_opp>;
56 			capacity-dmips-mhz = <544>;
57 			dynamic-power-coefficient = <102>;
58 		};

capacity-dmips-mhz = <544>中:

mips是每秒处理的百万级的机器语言指令数;

dmips是Dhrystone Million Instructions Per Second的缩写,dmips并非字面上每秒百万条指令的意思。它是一个测量CPU运行一个叫Dhrystone(整数运算)的测试程序时表现出来的相对性能高低的一个单位。Dhrystone并不包括浮点运算,其输出结果为每秒钟运行Dhrystone的次数,即每秒钟迭代主循环的次数。Dhrystone的重要性在于其能作为处理器整数计算性能的指标。

dmips-mhz 表示 CPU 在每 1MHz 的运行速度下每秒钟可以执行多少dmips.

cpu_scale: 每cpu变量,通过如下函数获得:

 21 unsigned long topology_get_cpu_scale(int cpu)
 22 {
 23     return per_cpu(cpu_scale, cpu);
 24 }

函数获得,计算方法参见:cpu_scale and freq_scale

kernel4.14/drivers/base/arch_topology.c

|init_cpu_capacity_callback()     //在哪被调?cpufreq_set_policy()通过notifier方式

441 for_each_cpu(cpu, policy->related_cpus) {
442     raw_capacity[cpu] = topology_get_cpu_scale(NULL, cpu) *
443                 policy->cpuinfo.max_freq / 1000UL;   
/* 
 *raw_capacity[cpu0~2]=544*1820000/1000=990080;
 *raw_capacity[cpu3]=1024*2028000/1000=2076672
 */
444     capacity_scale = max(raw_capacity[cpu], capacity_scale);     
/*
 *capacity_scale =2076672
 */
445 }
446
447 if (cpumask_empty(cpus_to_visit)) {
448     topology_normalize_cpu_scale();

|---->|356void topology_normalize_cpu_scale(void)

       366 for_each_possible_cpu(cpu) {
       367     capacity = (raw_capacity[cpu] << SCHED_CAPACITY_SHIFT)
       368         / capacity_scale;
       369     topology_set_cpu_scale(cpu, capacity);     //cpu_scale[0~2]=488; cpu_scale[3]=1024

由以上cpu_scale初始化的代码段可知,raw_capacity表示的是cpu在最大频率下dmips,即最大频率下每秒钟执行的百万次Dhrystone。

cpu_scale对大核来说,等于1024;
cpu_scale对小核来说,表示按raw_capacity比例把小核归一化到大核的1024,
所以cpu_scale表现的是cpu在最大频率时,执行指令数对1024的归一化,而最大频率取自policy->cpuinfo.max_freq,是cpu固有的最大频率,不受QOS/IPA的影响,是一个定值。

  • max_freq_scale的含义

include/linux/arch_topology.h

 38 static inline
 39 unsigned long topology_get_max_freq_scale(struct sched_domain *sd, int cpu)
 40 {
 41     return per_cpu(max_freq_scale, cpu);
 42 }

参见:《cpu_scale and freq_scale

max_freq_scale是cpu经过qos限频后,对cpu实际最高频scale到1024.

  • cpu_capacity的含义

kernel5.4/kernel/sched/fair.c  
 5422 static unsigned long capacity_of(int cpu)
 5423 {
 5424     return cpu_rq(cpu)->cpu_capacity;
 5425 }

capacity_of(cpu)在哪设置?
kernel/sched/fair.c:    cpu_rq(cpu)->cpu_capacity = capacity;    /*update_cpu_capacity()*/
kernel/sched/core.c:        rq->cpu_capacity = rq->cpu_capacity_orig = SCHED_CAPACITY_SCALE;    /*sched_init(void) */

参见:《eas k5.4 (一):v5.4 - Patch-set sched:fair: Reduce complexity of energy calculation

cpu_capacity是cpu_capacity_orig经过qos scale(限频),减去rq上的rt和dl util,对irq util做scale(减去irq util),最终得到的cpu实际的capacity。

  • cpu_capacity_orig的含义 

kernel5.4/kernel/sched/sched.h 
 2411 static inline unsigned long capacity_orig_of(int cpu)
 2412 {
 2413     return cpu_rq(cpu)->cpu_capacity_orig;
 2414 }
 2415 #endif

在如下代码中,可知cpu_capacity_orig=arch_scale_cpu_capacity(cpu)

kernel5.4/kernel/sched/fair.c
 7949 static void update_cpu_capacity(struct sched_domain *sd, int cpu)
 7950 {
 7951     unsigned long capacity = arch_scale_cpu_capacity(cpu);
 7958     cpu_rq(cpu)->cpu_capacity_orig = capacity;

 

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值