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.

[参考译文] 编译器:如何提高C6748的速度

Guru**** 2558250 points


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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/587338/compiler-how-to-improve-the-speed-of-c6748

工具/软件:TI C/C++编译器

浮点a=float 1.0 ,b=float 2.0 ,3.0 ;
int i;
同时(1)

  对于(i=0;i<10万;i++)

  { b=a*c;
  }

 GPIOPinWrite (SOC_GPIO _0_regs,110,GPIO PIN高);
 对于(i=0;i<10万;i++)
 {
 b=a*c;

GPIOPinWrite (SOC_GPIO _0_regs,110,GPIO PIN低);  

这是我的代码,I make a“for”loop,测量10万次a=b*c,,它花费5毫秒。我还使用“profile clock”,,每个a=b*c花费60个CPU周期。

我注意 到数据表中有两个段落:“数据表中有两个段落”,“数据表中有两个段落”。  

我尝试优化代码,但当我使用-O0时,a=b*c被跳过  

我想知道为什么每个 乘法花费60个周期,如何更改它。

我也试着写100 a=b*c和“循环变化到1000倍,增加装配线,花费2.2毫秒。

请给我一些指导。

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

    为了帮助您,我需要一个测试用例,让我完全按照相同的方式构建代码。  请:

    1. 预处理 包含此代码的源文件
    2. 将其附加到您的下一篇文章中
    3. 指示带有此代码的函数的名称
    4. 准确显示编译器看到的所有生成选项
    5. 指示所使用的编译器版本(而不是CCS)

    谢谢,此致,

    -George

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

    e2e.ti.com/.../math_5F00_cheng.rar

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    整个项目高于。我更改代码,现在大多数b=b*c花费6个CPU周期,但有些b*c花费了30个以上的CPU周期,我使用-O1,-pm,-mt.编译器版本是7.4 v.4
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    编译器非常智能。 如果你告诉它做了1000次的事情,而不去做任何事情,结果就会被忽略。 您需要执行求和或其他操作(可能只是使浮点变得易失),这样编译器就不会删除无效的代码。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我使用-O1[/QUOT]

    如果性能是一个问题,则必须至少使用--opt_level=2 (与-O2相同)进行构建。  使用--opt_level=2或更高版本可以启用软件流水线,这是C6000编译器中目前最重要的优化。

    但是,在这种特殊情况下,使用--opt_level=2会导致函数main()中的乘法计算全部消失。  所有这些优化只能对局部变量执行。  这些局部变量的值不会传递给任何其他函数。  因此,这些计算不能对整个系统状态产生任何影响。  使用--opt_level=2或更高版本进行构建时,编译器能够确定从未使用乘法计算,并且不为其生成代码。  

    我确信这并不代表您的实际代码的工作方式。  这是一个很好的猜测,这个项目是您的实际代码的简化形式。

    为了帮助我了解问题,我不需要生成和运行整个CCS项目。  我通常可以通过手动检查编译器生成的汇编代码来理解问题。  因此,请提交一个测试案例,它不是整个项目,而是其中的中心代码。  请:

    1. 使用 重要的乘法预处理源代码
    2. 将其附加到您的下一篇文章中
    3. 指示包含重要乘数的函数的名称
    4. 准确显示编译器看到的所有生成选项

    谢谢,此致,

    -George

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    它不是一个简化的形式,而是我的实际代码...起初,我只是想用10W乘以a=b*c来测试C6748的速度。代码非常简单。
    看到您的回复,我认为我测试10W倍浮点乘法的代码太简单,无法优化。所以,您能否给我一些建议,编写一段代码来测试DSP的浮点运算。在数据表中,我看到两句话:1.最高3648/2746 C674x2746 C674x MIPS/MFLOPS。 每个时钟2个SP x SP→SP。这是什么意思?如何实现?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您想进行哪种处理?
    FFT是一个很好的多路复用基准。

    正如我前面所说,您只需要使用结果。例如:

    浮点和,a,b;
    int i;
    
    for (i = 0;i < 1万; i++)
    {
    SUM ++ a*b;
    a=a+b; 1.0 2.0
    ;
    }
    
    SUM /= 10.0 ; 

    由于SUM是在循环之后使用的,因此它不会被优化。 请注意,可能会出现循环展开等其他优化。

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

    那么,您能否给我一些建议,让我编写一段代码来测试DSP的浮点运算。[/QUOT]

    请参阅应用手册 TI DSP基准。  但请注意,这不是本论坛的一个专门知识点。  如果您还有其他问题,我将向您推荐 C67x设备论坛

    谢谢,此致,

    -George

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢您的建议!
    我听从您的建议,更改代码。现在10W乘法浮点乘法花费0.23ms,它意味着400+MHz。
    您能告诉我浮点乘法的速度限制是多少?它是2746MFLOPS还是456MHZ?
    如果它是2746Mflops,我想知道如何实现它。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你需要听从George的建议(总是个好主意!) 并在适当的论坛上提问。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    能否告诉我浮点乘法的速度限制是什么?它是2746MFLOPS还是456MHZ?
    如果它是2746Mflops,我想知道如何实现它。

    遗憾的是,我们在这个论坛上的人缺乏知识来帮助你解决这个问题。  我建议您在 C67x设备论坛中开始新的主题。  或者,如果您愿意,我可以将此主题移至该论坛。

    谢谢,此致,

    -George