其中Pj为模型的参数与函数的算法复杂度与函数的输入相关;cj为相应的系数;p是参数个数。
构建模型的第一步是决定描述功耗模型的参数Pj。参数的选择与具体的函数所使用的算法密度相关。几种比较常见的算法的功耗模型可以表1中的线性公式来描述。
表1 基于复杂度的软件功耗模型
算 法
平均复杂度
软件功耗宏模型
数组求和
O(n)
c1+c2N
插入排序
O(n2)
c1+c2N+c3N2
快速排序
O(nlog2n)
c1+c2N+c3Nlog2N
参数确定之后,必须找到相应的系数cj,这是整个算法中最重要的步骤。一旦获得系数cj后,就可以利用这些系统估算出该函数在任何输入情况下的功耗。
要算出系数,首先要确定该函数的典型输入集合S={I1,I2,…,In},S中的每个Ii都与该函数一组模型参数Pj相对应。n个Ii对应形成一个该函数的模型参数矩阵。
通过底层指令级模型分析得到该函数在每组参数Ii情况下的功耗。
其中然后通过矩阵运算即可回归出参数向量C。
3 基于复杂度的插入排序函数软件功耗建模
以下将以Integrator/CM7TDMI评估板的ARM7TDMI微处理器为基础,对插入排序函数来构建基于复杂度的嵌入式软件功耗模型。
假设某运行在ARM7TDMI处理器上的函数,对一长度为n的整形数组a[n]使用简单插入排序算法进行排序。算法的C语言代码与其经过ARMCC编译器编译后的汇编代码如下:
void ins_sort(int a[],int n){
int x,i,j;
for(i=1;i
至此,可以得出完整的简单插入排序函数的基于复杂度的嵌入式软件功耗模型
E=93.51-5.38n+10.67 2
3.3 基于复杂度的嵌入式软件功耗模型的估算功耗
当输入数组长度为n=80的情况下,通过该模型可快速估算出插入排序函数的功耗
E=93.51-5.38%26;#215;80+10.67%26;#215;1600=67924.85(nJ)
与指令级功耗模型的估测值误差小于1%(表6),而利用基于复杂度的功耗模型估测该函数执行所需的功耗的速度而大大提高。
表6 各种数组长度下简单插入排序指令级功耗
数组长度
指令级功耗模型估测
基于复杂度的功耗模型估测
误 差
n=10
1106.338
-
-
n=20
4252.333
-
-
n=40
16943.823
-
-
n=80
67604.803
67924.85
0.4%
4 总结
本文介绍了一种基于复杂度的嵌入式软件功耗模型,以对象函数的算法平均复杂度的建模参数,利用现有底层指令级功耗模型对函数进行分析,回归出必需的系数,得到该函数完整的基于复杂度的嵌入式软件功耗模型,从而可快速估算出该函数在不同输入情况下的软件功耗。这种分析方法的缺点在于只适用于算法复杂度明显的一些函数,从而较容易构建基于复杂度的模型。另外在建模过程中,仍然需要指令级功耗模型的分析法的协助。