C6000软件优化经验总结(1)
?????? 3、优化方法说明:
?????? C6000编译器提供的intrinsic 可快速优化C代码,intrinsic用前下划线表示同调用函数一样可以调用它,即直接内联为C6000的函数。例如,在上例的源代码中没有使用 intrinsics,每一行C代码需多个指令周期,在改编后的代码中,每一行代码仅需一个指令周期。例如,
?????? “aReg_ll = (Word40)_mpyu(L_var1, L_var2)>>16”中“_mpyu”就是一个intrinsics函数,它表示两个无符号数的高16位相乘,结果返回。C6000支持的所有intrinsics指令及其功能参见《TMS320C6000系列DSP的原理与应用》一书的第265、266页,该书还提供了另外的例子。这些内联函数定义在CCS所在的C6000\CGTOOLS\Include目录下
的C6X.h文件中。下面这个例子是C6000的 “Programmer's Guide”上提取的使用intrinsics优化C代码的例子。
?????? 源代码:
int dotprod(const short *a, const short *b, unsigned int N)
{
??? int i, sum = 0;
??? for (i = 0; i < N; i++)
??????? sum += a[i] * b[i];
??? return sum;
}
?????? 改编后代码:
int dotprod(const int *a, const int *b, unsigned int N)
{
??? int i, sum1 = 0, sum2 = 0;
?
??? for (i = 0; i < (N >> 1); i++)
??? {
??????? sum1 += _mpy (a[i], b[i]);
??????? sum2 += _mpyh(a[i], b[i]);
??? }
???? return sum1 + sum2;
}
?????? 技巧:
?????? 在C语言的调试全部通过以后,可以尝试将尽可能多的语句使用intrinsics函数加以改编,尤其在循环体内,这种改编可以大幅度减少执行时间。