使用 const可以限定目标优化
1、源代码
void fir_fxd1(short input[], short coefs[], short out[])
{ int i, j;
for (i = 0; i < 40; i++)
{
for (j = 0; j < 16; j++)
out[i*16+j]= coefs[j] * input[i + 15 - j];
}
}
2、改编后的代码:
void fir_fxd2(const short input[], const short coefs[], short out[])
{
int i, j;
for (i = 0; i < 40; i++)
{
for (j = 0; j < 16; j++)
out[i*16+j]= coefs[j] * input[i + 15 - j];
}
3、优化方法说明:
C6000 编译器如果确定两条指令是不相关的,则安排它们并行执行。 关键字 const可以指定一个变量或者一个变量的存储单元保持不变。这有助于帮助编译器确定指令的不相关性。例如上例中,源代码不能并行执行,而结果改编后的代码可以并行执行。
4、技巧:
使用 const 可以限定目标,确定存在于循环迭代中的存储器的不相关性。
五、 使用内联指令优化算法
1、源代码:
void vecsum(short *sum, short *in1, short *in2, unsigned int N)
{
int i;
for (i = 0; i < N; i++)
sum = in1 + in2;
}
2、改编后的代码:
void vecsum6(int *sum, const int *in1, const int *in2, unsigned int N)
{
int i;
int sz = N >> 2;
_nassert(N >= 20);
for (i = 0; i < sz; i += 2)
{
sum = _add2(in1 , in2);
sum[i+1] = _add2(in1[i+1], in2[i+1]);
}
}
3、优化方法说明:
源代码中,函数变量的定义是 short *sum, short *in1, short *in2, 改编后的代码函数变量是 int *sum, const int *in1, const int *in2, 整数类型由 16 位改编成 32 位,这时使用内联指令“_add2”一次可以完成两组 16位整数的加法,效率提高一倍。注意这里还使用了关键字 const和内联指令_nassert优化源代码。
4、技巧:
用内联指令_add2、_mpyhl、_mpylh 完成两组 16 位数的加法和乘法,效率比单纯 16 位数的加法和乘法提高一倍。
|