|
优化方法说明:
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代码的例子。
源代码:
- <span style="color: rgb(51, 51, 51); font-family: " microsoft="" yahei";"="">int dotprod(const short *a, const short *b, unsigned int N)</span>
- <span style="color: rgb(51, 51, 51); font-family: " microsoft="" yahei";"="">{</span>
- <span style="color: rgb(51, 51, 51); font-family: " microsoft="" yahei";"=""> int i, sum = 0;</span>
- <span style="color: rgb(51, 51, 51); font-family: " microsoft="" yahei";"=""> for (i = 0; i < N; i++)</span>
- <span style="color: rgb(51, 51, 51); font-family: " microsoft="" yahei";"=""> sum += a[i] * b[i];</span>
- <span style="color: rgb(51, 51, 51); font-family: " microsoft="" yahei";"=""> return sum;</span>
- <span style="color: rgb(51, 51, 51); font-family: " microsoft="" yahei";"="">}</span>
复制代码
改编后代码:
- <span style="color: rgb(51, 51, 51); font-family: " microsoft="" yahei";"="">int dotprod(const int *a, const int *b, unsigned int N)</span>
- <span style="color: rgb(51, 51, 51); font-family: " microsoft="" yahei";"="">{</span>
- <span style="color: rgb(51, 51, 51); font-family: " microsoft="" yahei";"=""> int i, sum1 = 0, sum2 = 0;</span>
- <span style="color: rgb(51, 51, 51); font-family: " microsoft="" yahei";"=""> for (i = 0; i < (N >> 1); i++)</span>
- <span style="color: rgb(51, 51, 51); font-family: " microsoft="" yahei";"=""> {</span>
- <span style="color: rgb(51, 51, 51); font-family: " microsoft="" yahei";"=""> sum1 += _mpy(a[i], b[i]);</span>
- <span style="color: rgb(51, 51, 51); font-family: " microsoft="" yahei";"=""> sum2 += _mpyh(a[i], b[i]);</span>
- <span style="color: rgb(51, 51, 51); font-family: " microsoft="" yahei";"=""> }</span>
- <span style="color: rgb(51, 51, 51); font-family: " microsoft="" yahei";"=""> return sum1 + sum2;</span>
- <span style="color: rgb(51, 51, 51); font-family: " microsoft="" yahei";"="">}</span>
复制代码
技巧:
在C语言的调试全部通过以后,可以尝试将尽可能多的语句使用intrinsics函数加以改编,尤其在循环体内,这种改编可以大幅度减少执行时间。
|
|