Android系统功耗优化之CPU - CPU功耗和频率的关系

现在的处理器都支持DVFS - 动态频率电压调整,我们都知道DVFS的设计是为了low power,那么CPU频率和功耗之间的关系如何,运行在相同频率处理A任务和B任务功耗就一样吗?

同任务不同频率

在某Android平台,在单线程运行dhrystone的情况下, 可以看到随着DMIPS的增加(其实也就是频率的增加),Power数据前期相对平缓,后面就变陡了,越高频率功耗增加的越多(7000 DMIPS 功耗是400mW,频率加倍 14000 DMIPS 功耗1380mW,虽然性能是2倍,但是功耗变成了3.45倍)

Android系统功耗优化之CPU - CPU功耗和频率的关系_第1张图片

关于CPU功耗和电压频率的关系有一个公式,可以看到电压是以 V 2 V^2 V2 的级别来影响功耗的

P = C ∗ V 2 ∗ f P = C * V^2 * f P=CV2f

  • P是功耗
  • C可以简单看作一个常数,它由制程和设计等因素决定
  • V是电压
  • f是频率

从这里也可以看到一个程序功耗优化的方向 - 多线程

假设A程序原来是单线程,需要2GHz的频率来运行,现在把A程序改造成2个线程的,那理论上两个cpu 1GHz就够(参考某平台A53 2GHz-0.8V 1GHz-0.6V),而且处理时间相同
代入公式

  • 单线程 2GHz
    P s i n g l e = C ∗ 0.8 V 2 ∗ 2 G H z P_{single} = C * 0.8V^2 * 2GHz Psingle=C0.8V22GHz

  • 2线程 1GHz
    P m u l t i = 2 ∗ C ∗ 0.6 V 2 ∗ 1 G H z P_{multi} = 2 * C * 0.6V^2 * 1GHz Pmulti=2C0.6V21GHz

  • 结果
    P s i n g l e = 1.78 ∗ P m u l t i P_{single} = 1.78 * P_{multi} Psingle=1.78Pmulti

也就是说这种情况下, 维持效率不变, A程序的单线程会比双线程功耗高出78%

同频率不同任务

不同任务的场景相对复杂,比如有些任务是间断性性的,期间CPU可能处于空闲状态,当然功耗会低,为了比较方便,我们统一选取持续性负载的任务,测试期间一直占用CPU

在某Android平台上使用elephant stress的 分别使用单线程md5算法和sha-256算法,CPU都是处在最高频率,而且从trace信息也可以看到任务一直处于占用CPU的状态

  • 任务1 sha-256算法

systrace CPU占用
Android系统功耗优化之CPU - CPU功耗和频率的关系_第2张图片

功耗430mA 4V
Android系统功耗优化之CPU - CPU功耗和频率的关系_第3张图片

  • 任务2 md5算法

systrace CPU占用
Android系统功耗优化之CPU - CPU功耗和频率的关系_第4张图片

功耗300mA 4V
Android系统功耗优化之CPU - CPU功耗和频率的关系_第5张图片

从上面的实测数据可以看到,sha-256算法的功耗会比md5算法要高出45%, 虽然CPU都是在最高频率运行,中间也没有出现idle或者是空闲的情况。

关于这个问题有一篇知乎的文章知乎的文章讲的比较好,套用到上面的两个算法来看,可以简单理解为不同算法,CPU运行时候的指令是有很大差别的,不同的指令又对应不同数量和类型的晶体管,每条指令所要调动的晶体管数目不同(fetch,decode,excute,memory),而功耗是被调动晶体管功耗的总和。

所以虽然我们看到同样的频率,CPU的占用率也是满的,但是功耗是可以差别很大。

你可能感兴趣的:(Linux,CPU,Android,System,Android系统功耗优化)