This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] CCS/TMS320F28377S:优化 CCS7中的 CLA 代码

Guru**** 2463330 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/614017/ccs-tms320f28377s-optimize-cla-code-in-ccs7

器件型号:TMS320F28377S

工具/软件:Code Composer Studio

大家好、  

我尝试使用28377中的 CLA 来处理如下所示的 for 循环:

在 file.cla 中、  

对于(ii = 0;ii < 64;ii +){

sum = sum+vector[i];

Ave =总和/64;

我使用 GPIO 切换来测量时序、使用-02速度空间5;环路的成本仍然为35uS。 但是、如果我使用这样的愚蠢方法:

总和= 0;

sum = sum+vector1[0]+vector1[1]+vector1[2]+vector1[3]+vector1[4]+vector1[5]+vector1[6];
sum = sum+vector1[0]+vector1[1]+vector1[2]+vector1[3]+vector1[4]+vector1[5]+vector1[6];
sum = sum+vector1[0]+vector1[1]+vector1[2]+vector1[3]+vector1[4]+vector1[5]+vector1[6];
sum = sum+vector1[0]+vector1[1]+vector1[2]+vector1[3]+vector1[4]+vector1[5]+vector1[6];
sum = sum+vector1[0]+vector1[1]+vector1[2]+vector1[3]+vector1[4]+vector1[5]+vector1[6];
sum = sum+vector1[0]+vector1[1]+vector1[2]+vector1[3]+vector1[4]+vector1[5]+vector1[6];
sum = sum+vector1[0]+vector1[1]+vector1[2]+vector1[3]+vector1[4]+vector1[5]+vector1[6];
sum = sum+vector1[0]+vector1[1]+vector1[2]+vector1[3]+vector1[4]+vector1[5]+vector1[6];
sum = sum+vector1[0]+vector1[1]+vector1[2]+vector1[3]+vector1[4]+vector1[5]+vector1[6];
.

结果很有希望。 我尝试了定义  

#pragma UNROLL (64)

对于(ii = 0;ii < 64;ii +){

sum = sum+vector[i];

运气差、我检查了时钟时间和 GPIO 切换、都没有变化。  顺便说一下、在 CPU 空间中、可以使用-O2和5很好地自动优化环路。  

我可以做的是让 CCS 知道自动在*。cla 文件中展开循环。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    更具体地说、在 CPU 空间中、在没有任何优化的情况下、回路上方的4个成本为35US-50us、而4个回路成本为5.5us、速度空间为-02;在 CLA 中、手动开环为4个回路成本为3.5us、而在没有手动打开的情况下、4个回路成本为50us。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    我写信告诉您、C2000团队成员已被分配到此帖子、应该很快回答。

    此致、
    Elizabeth
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    首先、您是求和取浮点值还是求平均值? 在这种情况下、CLA 的性能应优于具有优化代码的 C28x。

    其次、CLA (以及 C28x)在执行分支运算时都不太好。 它们是 DSP、旨在高效执行数学运算。 这就是您通过手动展开"for loop"看到性能如此提高的原因。

    我不确定 #pragma 为什么不能正常工作。 我建议向编译器团队发布消息、以了解编译器为什么不使用 pragma 上的优化或甚至是使用 pragma 展开循环。

    SAL
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    是的、我正在  对数组 UINT16进行求和求平均、但求平均值结果应该是浮点的。  

     我对 DSP 不是很新鲜。 您能否给我一些线索、告诉我如何使用  CLA 优化求和和平均?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您使用的手动展开循环的优化技术非常好。

    由于 CLA 是一个浮点引擎、因此最好对浮点数求和。

    您可以:
    1) 1)确保向量为浮点类型(float)
    2) 2)确保 SUM 为浮点型(float)
    3) 3)尝试 C 语句"float ave = SUM / 64F;"
    4) 4)展开循环