现在的处理器都支持DVFS - 动态频率电压调整,我们都知道DVFS的设计是为了low power,那么CPU频率和功耗之间的关系如何,运行在相同频率处理A任务和B任务功耗就一样吗?
同任务不同频率
在某Android平台,在单线程运行dhrystone的情况下, 可以看到随着DMIPS的增加(其实也就是频率的增加),Power数据前期相对平缓,后面就变陡了,越高频率功耗增加的越多(7000 DMIPS 功耗是400mW,频率加倍 14000 DMIPS 功耗1380mW,虽然性能是2倍,但是功耗变成了3.45倍)
关于CPU功耗和电压频率的关系有一个公式,可以看到电压是以 的级别来影响功耗的
- P是功耗
- C可以简单看作一个常数,它由制程和设计等因素决定
- V是电压
- f是频率
从这里也可以看到一个程序功耗优化的方向 - 多线程
假设A程序原来是单线程,需要2GHz的频率来运行,现在把A程序改造成2个线程的,那理论上两个cpu 1GHz就够(参考某平台A53 2GHz-0.8V 1GHz-0.6V),而且处理时间相同
代入公式
-
单线程 2GHz
-
2线程 1GHz
-
结果
也就是说这种情况下, 维持效率不变, A程序的单线程会比双线程功耗高出78%
同频率不同任务
不同任务的场景相对复杂,比如有些任务是间断性性的,期间CPU可能处于空闲状态,当然功耗会低,为了比较方便,我们统一选取持续性负载的任务,测试期间一直占用CPU
在某Android平台上使用elephant stress的 分别使用单线程md5算法和sha-256算法,CPU都是处在最高频率,而且从trace信息也可以看到任务一直处于占用CPU的状态
- 任务1 sha-256算法
systrace CPU占用
功耗430mA 4V
- 任务2 md5算法
systrace CPU占用
功耗300mA 4V
从上面的实测数据可以看到,sha-256算法的功耗会比md5算法要高出45%, 虽然CPU都是在最高频率运行,中间也没有出现idle或者是空闲的情况。
关于这个问题有一篇知乎的文章知乎的文章讲的比较好,套用到上面的两个算法来看,可以简单理解为不同算法,CPU运行时候的指令是有很大差别的,不同的指令又对应不同数量和类型的晶体管,每条指令所要调动的晶体管数目不同(fetch,decode,excute,memory),而功耗是被调动晶体管功耗的总和。
所以虽然我们看到同样的频率,CPU的占用率也是满的,但是功耗是可以差别很大。