编写更节能的程序
编写更节能的程序
看到这个题目的时候,读者可能会诧异:代码也有节能与不节能之分?我们说,是的,本质上,程序所调度的是硬件资源,不合理的硬件调度,会使得设备调度效率不高,从而产生更高的能耗。 实际上,随着移动终端的流行,功耗比已然成为比较处理器的重要参数。在已经上市,可能大放光彩的超级本上(Ultrabook),功耗更成为重要的考虑因素。实际上英特尔已经大量考虑了硬件层面的功耗优化,微软将在Windows8中增强功耗优化,第三方软件也将不可避免的影响到功耗,而实际上ill behaving的软件或服务甚至可能会使得所有硬件层和系统层所作的功耗优化功亏一篑。
当前来讲,对于同质化的软件,其差异性在于性能,功能,用户体验等,在不久的将来,功耗可能成为重要特性之一。想象一下,在超级本普及之后,一个软件能支撑十个小时,而另外一个只能七个小时,那么用户尤其是没有外接电源的情况下必然更倾向于前者。
闲话短续,那么什么样的软件是节能的软件呢?通常可以从下面两个工作状态来看:
Idle workloads:
1. 处理器和平台能够长时间处于idle状态,避免软件的高频执行,比如统计等;
2. 应当尽可能的将任务联合,协调和分批处理;避免频繁的执行程序,最小化后台服务;
3. 软件不能够影响平台硬件组件进入到深一层的power state(往往是因为太多的中断所造成)。
4. 当系统idle的时候,使硬盘降速(spin down)。避免周期性的硬盘访问注册。
Active workload:
1. 提高计算的有效性和CPU的使用效率,目的是让系统进入到更长时间的idle状态;
2. 减少处理器的C-state切换的次数,频繁的C-state切换会导致能量的损耗;
3. 对于多核架构,最大化多核程序执行的并发性,这样可以是package 层次的资源和platform层次的资源得到更有效的管理;
4. 减少程序的执行频率,对于有特定cpu使用率的任务来说,让它运行更长的时间,更低的频率,更节能。
5. 程序中如果提高了timer分辨率对功耗有很大的影响,尽量使用大的timer的时间间隔,如果必须使用小的timer间隔,当任务完成之后,将其重置为大的值。
实际功耗分析中,package state, core state, c-state等都将是重要的考虑参数。从上面这些点中可以看到,所谓功耗优化,本质上无非是从平台的角度考虑性能优化。功耗的问题,不仅仅是CPU性能问题,而降低CPU的利用率则是第一步,这可以使用英特尔的Vtune工具。
(下载地址:/en-us/articles/intel-vtune-amplifier-xe/)
对于平台的功耗优化来说,还要考虑如何提高程序的并发性,如何减少外设(硬盘等)的电源的损耗,而这都是与软件的运行特性相关的。我们将在未来的博客中进一步分析如何才能写更节能的程序。
转载于:http://software.intel.com/zh-cn/blogs/2011/12/26/400009546/?cid=sw:prccsdn2127