源码级和算法级的功耗测试与优化

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

源码级和算法级的功耗测试与优化

源码级和算法级的功耗测试与优化

软件设计中,代码优化是一件非常有意义的事情。优化的本质是对代码进行等价变换,使变换前后的代码运行结果相同,但变换后的代码比变换前的代码具有更多优越性能。传统的观点要求变换后的代码运行速度较快或占用较少运行资源,或二者兼备。随着嵌人式系统的快速发展,软件功耗问题显得越来越重要,应该

将“省电”作为软件优化的一项技术指标,这样对软件优化的评价

体系才算完整。值得注意的是,大多数情况下性能和功耗并不矛盾,减少程序执行时间同样会使程序功耗减少。

在功耗优化这个问题上,研究者普遍比较关注硬件功耗优化,应用各种技术想方设法改进硬件的功耗,比如在芯片制造工艺上采用更精细的纳米技术,不断降低芯片驱动电压,不断改变片内系统结构等。事实上,整个系统的运行管理是由软件体现的。在硬件基础一定的情况下,只有将软件系统对能量的损耗降至最小,才能使整个系统工作于最佳状态。面向功耗的软件优化方法是当前嵌入式系统低功耗研究领域的热点。掌握软件运行时的能量消耗特征、准确获取能量消耗数据信息,是面向低功耗的软件优化研究的前提。经过多年的努力,许多学者也提出了关于如何减少软件功耗的方法。研究表明,软件优化对降低功耗会有数量级的贡献。针对同一任务,所选择的算法不同或采用不同的实现方式,不仅性能有差别,能耗也大不一样。因此在进行系统优化设计时,除了代码的规模和执行性能之外,功耗也是一个需要认真考虑的问题。

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位浮点型的基本操作功耗。基本操作有:加、减、乘、除、取余、赋值、移位、与、或、非。此处测试的结果与处理器的位数有关,StrongARM110为32位精简指令集系统,在此基础上测试的结果如表1所列。

从表1可知,对于相同数据类型,加、减、乘、除和取余操作的功耗一样,与、或、非操作的功耗一样,而移位功耗最低。对于不同数据类型来说,32位数比16位数的操作功耗低,16位数比8位数的操作功耗低。32位浮点数与32位整形数的操作功耗一样。在所有数据类型中64位浮点数的操作功耗最高。

测试环境的处理器StrongARM110为32位处理器,对8位数和16位数的处理要考虑字节对齐问题,而对32位就不用考虑该问题。

②对函数、内联函数和宏定义的功耗进行测试。如表2所列,内联函数和宏定义的功耗比一般函数的功耗低,CPU周期数及指令数也小。

③对相同功能不同实现语句的功耗进行测试。主要针对循环语句、选择语句(二元和多元)、乘法、移位、除法、移位进行测试,测试结果如表3所列。

从表3可知,同样实现循环功能,for循环的功耗比while、goto的要大,goto 语句的功耗明显最低;二元选择运算中三目运算比if语句的功耗低,但是只能在单条赋值语句中使用三目运算,在复杂的多条语句的情况下,两者功耗一样;多元选择运算中,switch语句比if…elseif…语句功耗低;寄存器变量的操作比自动变量的操作功耗低近50%,因为处理器从寄存器里直接读取

相关文档
最新文档