源码级和算法级的功耗测试与优化
软件设计中,代码优化是一件非常有意义的事情。优化的本质是对代码进行等价变换,使变换前后的代码运行结果相同,但变换后的代码比变换前的代码具有更多优越性能。传统的观点要求变换后的代码运行速度较快或占用较少运行资源,或二者兼备。随着嵌人式系统的快速发展,软件功耗问题显得越来越重要,应该将"省电"作为软件优化的一项技术指标,这样对软件优化的评价体系才算完整。值得注意的是,大多数情况下性能和功耗并不矛盾,减少程序执行时间同样会使程序功耗减少。
在功耗优化这个问题上,研究者普遍比较关注硬件功耗优化,应用各种技术想方设法改进硬件的功耗,比如在芯片制造工艺上采用更精细的纳米技术,不断降低芯片驱动电压,不断改变片内系统结构等。事实上,整个系统的运行管理是由软件体现的。在硬件基础一定的情况下,只有将软件系统对能量的损耗降至最小,才能使整个系统工作于最佳状态。面向功耗的软件优化方法是当前嵌入式系统低功耗研究领域的热点。掌握软件运行时的能量消耗特征、准确获取能量消耗数据信息,是面向低功耗的软件优化研究的前提。经过多年的努力,许多学者也提出了关于如何减少软件功耗的方法。研究表明,软件优化对降低功耗会有数量级的贡献。针对同一任务,所选择的算法不同或采用不同的实现方式,不仅性能有差别,能耗也大不一样。因此在进行系统优化设计时,除了代码的规模和执行性能之外,功耗也是一个需要认真考虑的问题。
1软件功耗优化方法
常用的软件功耗优化方法大致可分为以下4类:
(1)软件体系结构级
不存在没有体系结构的软件。通常考虑软件体系结构都是注重软件的可修改性、可重用性和可靠性等问题,软件体系结构的好坏直接关系到软件性能的好坏。而且前,关于软件体系结构对软件功耗影响这方面的研究较少,用不同软件体系结构开发出的软件功耗会有差异,怎样选择合适的软件体系结构使软件功耗最小化,将成为软件低功耗优化的重要研究方向。
(2)源程序级
C语言的源程序级功耗优化指的是实现同一功能的不同语句间的选择。比如,同样实现循环功能,有多种选择(for、while、goto等)。这些语句的功耗会有差异,为了实现低功耗的软件,应采用功耗最低的语句来完成相同的功能。这就需要对所有语句的功耗进行测试与研究。同时,对C语言不同数据类型操作的功耗进行分析。比如,同样表示数目,可以用8位int型、16位int型和32位int型。再者,对不同变量的存储类型功耗也要进行分析,如寄存器变量、静态变量、自动变量等。总之,在源码级对软件功耗进行优化是一个重要的研究方向。
(3)算法级
算法是为解决某个特定问题而定义的无二义性的操作序列,算法复杂性分析就是对算法运行时所消耗的计算机资源作量化的分析和预测。以往,程序设计者关心的资源主要是运行时间和存储空间。由于能量消耗已成为软件设计中的关键约束条件,因此本文将能耗作为一项重要资源,对算法运行时所消耗的能量进行分析和比较。
(4)编译级
对于某个硬件来说,执行程序所产生的功耗取决于它的机器代码,而机器代码是从源代码编译而来的,这就说明编译过程也影响了硬件的功耗。既然编译器可以很大程度上控制硬件的运行轨迹,除了性能这一传统的优化目标之外,编译器也可以通过适当的调度优化,使得硬件执行某一个程序时的功耗变小。国际上对于低功耗编译的历史并不长,是从20世纪90年代初才开始研究的,这方面的文章最早出现于文献[4-5],Tiwari等人在这些文章中提出了对软件进行功耗分析的一些基本概念,建立了基本的指令级功耗模型,以486DX为例初步探讨了低功耗编译技术。
本文主要从源程序级和算法级这两个方面对软件功耗特征进行测试与分析,并根据分析结果对μC/OS-II进行源码级的功耗优化。
2源码级和算法级的功耗测试
测试环境是T.K.Tan等人研发的EMSIM,它是一个基于指令级的嵌入式软件功耗模拟器,其主要的功耗估算思想是累计函数中所有单条指令的功耗作为该函数的总功耗。嵌入式硬件平台是ARM公司的StrongARM110。EMSIM测试功耗的单位为函数,即它只能测试某个函数的功耗。在本文的测试中,将要测试的语句放入函数中,测得整个函数的功耗,记为E1,然后测试同样参数及返回值的空语句函数的功耗,记为E2,最后计算得到语句的功耗为:E=E1-E2。
2.1源码级的功耗测试
本小节对C语言的源码级功耗进行测试,测试过程分为以下几步:
①对每种数据类型的不同操作的功耗进行测试。要测试8位整型、16位整型、32位整型以及32位浮点型和64位浮点型的基本操作功耗。基本
- 无线自组织网络测试平台设计与实现(08-18)
- 蓝牙散射网网间通信问题的研究(04-10)
- 如何应对被公开的Oracle口令加密算法(05-06)
- TD-HSDPA网络规划及组网策略(07-01)
- “多大程度的安全才算安全”(07-08)
- 常用数据无损压缩算法分析(08-10)