全部博文(436)
分类: LINUX
2012-12-03 20:14:33
在计算机系统中,以CMOS数字集成电路为基础的微处理器、存储器等器件的能耗是器件在一段时间里消耗的电能。
目前的能耗优化技术逐渐从硬件方面的研究转向了软件方面的研究:
在我看来,虽然从软件的角度进行能耗优化有很多优势,但是要找到一套优化方法是可移植的、通用的,还是很困难的,我们常常要被很多条件所限制。
首先说说怎么进行软件能耗估算。
这里有一个能耗评估公式:E(software) = Σ(i∈components)(Ti×Pi)。
如果这个问题由我来回答,那我觉得最简单的方法就是用控制单一变量的方法做测量。简单点说,某计算机仅由电池供电,把计算机中其余进程全部关闭,只留下视频播放,然后用外部的物理方法测量x分钟后电池的耗电量。这个耗电量即可视为它的E(software)。
然而文章提到了从不同级别的角度去看待能耗估算,从不同角度提出能耗模型:
指令级模型:E =Σ(Bi×Ni)+Σ(Qi,j×Ni,j)+Σ(Sk).其实我觉得这个级别的模型意义不是很大啊,似乎把问题看的太微观了。既然我们的最终目的是评估能耗,那么我们应该直接从代码对外界(比如电能消耗)的影响着手,而不是拘泥于代码的本质(比如代码的内容,代码的顺序)。程序千变万化,代码顺序也可以多种多样,Ni和Ni,j本身就是个很大的数,而且Qi,j与Ni,j之间的关系并不能很好表达。另外,在一些程序中,某一行代码执行与否也会受它前面代码的影响。所以建立所谓的“指令能耗数据库”很困难也不一定准确。
相比起上一种模型,处理器体系结构级模型和宏模型可能更为直观一些。这就好比电路原理中的二端模型,把源代码用框框起来,不考虑内部如何复杂,只通过分析输入输出,即对外界的影响,去衡量它的能耗量。
然后是能耗优化,重点来看一下“面向开发阶段的软件能耗技术”:
指令级 |
算法级 |
体系结构级 |
减少指令时间、删除冗余操作指令等 |
选用低能耗的任务间通信方式、改进虚拟内存管理等 |
优化体系结构风格 |
二、为实现能耗优化的软件编写的技术
(针对第一部分的“面向开发阶段的软件能耗技术”指令级来说)
1.使用全局变量比向函数传递参数更加有效。
2.在声明变量时,需要考虑怎样最佳地控制存储器布局。
3.编译器会把局部变量分配给内部寄存器
(这时要避免产生冗余变量吧)。
4.在声明局部变量的时候可以使用register关键字(?)。
5.宏代替函数实现类似函数功能而又不具函数调用和返回开销。
6.在数组寻址中,尽量使用2的幂次方尽量使用一维数组。
7.使用switch/case语句是,按照它们发生的相对频率排序
(这种排序可以用最小二叉树来解决吧)。
8.If语句将计算速度最快的表达式放在左边。
9.将不变的代码移到循环之外,将分支语句提到循环的外面。
10.尽量使用自减计数。
11.在C程序中直接插入_asm{}内嵌汇编语句。
12.使用C语言的位操作可以减少除法和取模的运算。
13.乘法运算比求平方运算快。