查看: 1440|回复: 0

[经验] C6000使用的优化方法说明

[复制链接]

该用户从未签到

发表于 2021-3-2 09:31:36 | 显示全部楼层 |阅读模式
分享到:
优化方法说明:
        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代码的例子。

源代码:

  1. <span style="color: rgb(51, 51, 51); font-family: " microsoft="" yahei";"="">int dotprod(const short *a, const short *b, unsigned int N)</span>
  2. <span style="color: rgb(51, 51, 51); font-family: " microsoft="" yahei";"="">{</span>
  3. <span style="color: rgb(51, 51, 51); font-family: " microsoft="" yahei";"="">        int i, sum = 0;</span>

  4. <span style="color: rgb(51, 51, 51); font-family: " microsoft="" yahei";"="">        for (i = 0; i < N; i++)</span>
  5. <span style="color: rgb(51, 51, 51); font-family: " microsoft="" yahei";"="">                sum += a[i] * b[i];</span>
  6. <span style="color: rgb(51, 51, 51); font-family: " microsoft="" yahei";"="">        return sum;</span>
  7. <span style="color: rgb(51, 51, 51); font-family: " microsoft="" yahei";"="">}</span>
复制代码

改编后代码:
  1. <span style="color: rgb(51, 51, 51); font-family: " microsoft="" yahei";"="">int dotprod(const int *a, const int *b, unsigned int N)</span>
  2. <span style="color: rgb(51, 51, 51); font-family: " microsoft="" yahei";"="">{</span>
  3. <span style="color: rgb(51, 51, 51); font-family: " microsoft="" yahei";"="">        int i, sum1 = 0, sum2 = 0;</span>

  4. <span style="color: rgb(51, 51, 51); font-family: " microsoft="" yahei";"="">        for (i = 0; i < (N >> 1); i++)</span>
  5. <span style="color: rgb(51, 51, 51); font-family: " microsoft="" yahei";"="">        {</span>
  6. <span style="color: rgb(51, 51, 51); font-family: " microsoft="" yahei";"="">                sum1 += _mpy(a[i], b[i]);</span>
  7. <span style="color: rgb(51, 51, 51); font-family: " microsoft="" yahei";"="">                sum2 += _mpyh(a[i], b[i]);</span>
  8. <span style="color: rgb(51, 51, 51); font-family: " microsoft="" yahei";"="">        }</span>
  9. <span style="color: rgb(51, 51, 51); font-family: " microsoft="" yahei";"="">        return sum1 + sum2;</span>
  10. <span style="color: rgb(51, 51, 51); font-family: " microsoft="" yahei";"="">}</span>
复制代码

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

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /2 下一条



手机版|小黑屋|与非网

GMT+8, 2024-4-20 10:23 , Processed in 0.108851 second(s), 15 queries , MemCache On.

ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

苏公网安备 32059002001037号

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.