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