打印

C6000点滴学习:c6000系列的C代码优化(三)

[复制链接]
446|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Roses|  楼主 | 2017-11-10 10:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
c6000系列的C代码优化(三)


三、16位变为 32 位操作,使用 intrinsi函数,用 const等。   
        1、源代码:  
  • Word32 L_mpy_ll(Word32 L_var1, Word32 L_var2)   
  • {  
  •    double  aReg;  
  •     Word32 lvar;  
  •     /* (unsigned)low1 * (unsigned)low1 */  
  •         aReg = (double)(0xffff & L_var1) * (double)(0xffff & L_var2) * 2.0;   
  •       /* >> 16 */   
  •         aReg = (aReg / 65536);   
  •     aReg = floor(aReg);  
  •     /* (unsigned)low1 * (signed)high2 */  
  •         aReg += (double)(0xffff & L_var1) * ((double)L_shr(L_var2,16)) * 2.0 ;   
  •     /* (unsigned)low2 * (signed)high1 */  
  •         aReg += (double)(0xffff & L_var2) * ((double)L_shr(L_var1,16)) * 2.0 ;   
  •       /* >> 16 */   
  •         aReg = (aReg / 65536);   
  •     aReg = floor(aReg);  
  •       /* (signed)high1 * (signed)high2 */   
  •         aReg += (double)(L_shr(L_var1,16)) * (double)(L_shr(L_var2,16)) * 2. 0;   
  •     /* saturate result.. */  
  •     lvar = L_saturate(aReg);  
  •     return(lvar);  
  • }  

复制代码
       2、改编后的代码:  
  • static inline Word32 L_mpy_ll(Word32 L_var1, Word32 L_var2)   
  • {  
  •     Word32 aReg_hh;  
  •     Word40 aReg,aReg_ll,aReg_lh,aReg_hl;  
  •     aReg_ll = (Word40)_mpyu(L_var1, L_var2)>>16;  
  •     aReg_lh = (Word40)_mpyluhs(L_var1, L_var2);  
  •     aReg_hl = (Word40)_mpyhslu(L_var1, L_var2);  
  •     aReg_hh = _smpyh(L_var1, L_var2);  
  •     aReg    = _lsadd(aReg_ll, _lsadd(aReg_lh, aReg_hl));  
  •     aReg    = _lsadd(aReg>>15, aReg_hh);  
  •     return(_sat(aReg));  
  • }  

复制代码
       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 * b;  
  •     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, b);  
  •         sum2 += _mpyh(a, b);  
  •     }  
  •      return sum1 + sum2;  
  • }  

复制代码
       技巧:  
        在 C语言的调试全部通过以后,可以尝试将尽可能多的语句使用 intrinsics函数加以改编,尤其在循环体内,这种改编可以大幅度减少执行时间。

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

709

主题

1023

帖子

7

粉丝