c6000系列的C代码优化(四)

2019-07-30 16:09发布

使用 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 位数的加法和乘法提高一倍。

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
3条回答
huangfeng33
2019-07-30 22:23
七、数组最小值运算优化  
        1、源程序
  dm = 0x7FFF;  
        for (j = 0; j < nsiz[m]; j = add(j, 1))   
    {  
        if (d[j] <= dm)  
        {  
            dm = d[j];  
            jj = j;  
        }  
    }  
    index[m] = jj;  
2、优化后的程序  
     dm0 = dm1 = 0x7fff;   
            d0  = (Word16 *)&d[0];  
            d1  = (Word16 *)&d[1];  
    #pragma MUST_ITERATE(32,256,64);  
        for (j = 0; j < Nsiz; j+=2)   
    {  
        n0 = *d0;  
        d0 += 2;  
        n1 = *d1;  
        d1 += 2;  
        if (n0 <= dm0)  
        {  
            dm0 = n0;  
            jj0 = j;  
        }  
        if (n1 <= dm1)  
        {  
            dm1 = n1;  
            jj1 = j+1;  
        }  
    }  
    if (dm1 != dm0)  
    {  
        index[m] = (dm1 < dm0)? jj1:jj0;  
}      
else  
    {  
       index[m] = (jj1 > jj0)? jj1:jj0;  
    }  
   3、优化说明  
        求数组的最小值程序,优化时为了提高程序效率在一个循环之内计算 N=1,3,5..和n=2,4,6...的最小值,然后在比较二者的大小以求得整个数组的最小值。  



一周热门 更多>