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.

[参考译文] TMS320F28375D:CLA 比 FPU 慢

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1019481/tms320f28375d-cla-slow-compared-to-fpu

器件型号:TMS320F28375D

团队-

代表正在开始上升到'28375的客户发布此消息、并将在该主题上抄送他们。  如果您想了解更多详细信息、请在内部与我联系。

来自客户:


我正在测试一些代码的时序、并且希望控制律执行器(CLA)比使用浮点单元(FPU)运行的代码快得多。 但是、当我测试它时、FPU 比从 CLA 运行的相同代码快大约5微秒。 根据这些文档、我被引导至相信从 CLA 运行的代码会快得多?


此外、


 是否可以从 CLA 读取/写入 ePWM 寄存器(即 Epwm1Regs.CMPA)?


请指引我们查看相应的文档领域、如果有任何相关的培训模块、请告知我。   

谢谢!

最好、Steve

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

    您好、Steve、

    CLA 是一个浮点引擎、所以通常如果代码涉及大量浮点数学运算、那么 CLA 应该和 C28+FPU 一样执行。 然而、与 C28相比、CLA 在整数运算或三角运算方面表现不是很好、因为 C28具有更好的整数支持 和执行三角数学的 TMU 引擎。 客户可能希望查看在 CLA 上运行的代码、并确定这些因素中是否有任何一个导致执行性能差异。

    我们有一个 CLA 软件开发指南、其中包含有用的信息。 例如、以下是一个研讨会列表:

    https://software-dl.ti.com/C2000/docs/cla_software_dev_guide/getting_started.html#workshops

    2.是的、对于 F2837x 器件、CLA 确实可以访问 ePWM。 下面是一些有关如何了解 CLA 可以访问哪些外设的好信息:

    https://software-dl.ti.com/C2000/docs/cla_software_dev_guide/faq.html#which-peripheral-registers-can-the-cla-access-directly

    谢谢、

    Ashwini

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

    非常感谢!

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

    你好!

    感谢您的回答。

    我正在测试我的代码、并意识到了其他一些原因、这就是代码运行速度变慢的原因。 我经常使用数组(包含浮点数)、并注意到 CLA 的运行速度比 FPU 慢/相同

    1) 1)我使用变量作为索引。

    例如:

    uint16 i、x;

    I = 0;

    x = array1[i]+ array2[i];

    array1[]和 array2[]是 float32全局变量并在 main.c 中初始化

    2) 2)设置数组位置的值

    例如:

    uint16 i;

    I = 0;

    结果[i]=23.3 + 90.9;

    result []也是在 main.c 中初始化的 float32全局变量

    我想知道我是否需要更改一些内容、以便 CLA 能够更快地运行? 我知道如果对数组进行硬编码、CLA 的位置会更快、但我的代码需要使用变量索引。

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

    您好、Casey、

    我将与专家进行联系、并在我从团队返回后告知您任何建议。

    谢谢、

    Ashwini

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

    你好!

    又发现了一个奇怪的(?)

    3)

    当我比较 float ("<"、"<="、">"、">=")时、无论是从数组还是常数、CLA 都较慢。 (当我使用"="或"!="进行比较时,它们的速度大致相同)。

    例如:

    //时间:FPU -40ns;CLA -60ns

    uint16 x;

    if (1.2 < 2.3){

      X = 5;

    Ex2:

    //数组在 main 中初始化为全局数组[3]={1.2、3.4、5.6}

    // 0.1μs:FPU - 0.08μs μ s;CLA -μ s

    uint16 x;

    if (array[0]< 2.3){

      X = 5;

    谢谢!

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

    您好、Casey、

    谢谢、我也会与团队分享这一点。

    您能告诉我正在使用的编译器版本和优化级别吗?

    此致、

    Ashwini

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

    你好!

    编译器:TI v20.2.1.LTS

    优化级别:关闭

    速度与尺寸取舍:2.

    浮点模式:严格

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

    Casey、

    只是想让你知道 Ashwini 已经离开办公室几天了,我会确保其他人对这篇文章有眼光,但最坏的情况你可以期待下周四她回到办公室时的回复。

    最棒的

    Matthew

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

    卡西-

    当您进行比较(如<或>)时、处理器必须计算参数的差异并计算余数。  通过按位比较可以更快地完成对等性的检查=或!=。  这可能会解释差异。

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

    您好、Casey、

    很抱歉稍后回复。 我为您发布的2个示例(再次在下面发布以供参考)提供了 CLA 和 C28的尝试、我没有看到为 CLA 和 C28生成的代码的周期计数有显著差异。 您能否发布为 CLA 生成的汇编文件并让我知道您如何对 CLA 进行基准测试?

    例如:

    //时间:FPU -40ns;CLA -60ns

    uint16 x;

    if (1.2 < 2.3){

      X = 5;

    Ex2:

    //数组在 main 中初始化为全局数组[3]={1.2、3.4、5.6}

    // 0.1μs:FPU - 0.08μs μ s;CLA -μ s

    uint16 x;

    if (array[0]< 2.3){

      X = 5;

    谢谢、

    Ashwini

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

    你好!

    为了给 CLA 和 FPU/C28代码计时、我使用了 GPIO 分接引脚和逻辑分析仪对其计时。 同时运行或单独运行不会造成明显的时间差异。

    //in gpio.c
    void InitGpio(void)
    {
        GpioCtrlRegs.GPBCSEL2.all = 0x00010000 //GPIODAT/SET/CLEAR/TOGGLE reg. master
        GpioCtrlRegs.GPBDIR1bit.GPIO39 = 1;
        GpioDataRegs.GPBSET.bit.GPIO39 = 1;
        GpioCtrlRegs.GPBDIR.bit.GPIO44 = 1;
        GpioDataRegs.GPBSET.bit.GPIO44 = 0;
    }
    
    //in ClaTasks_C.cla
    //have a ADC trigger this task once in a while
    interrupt void ClaTask1 (void)
    {
        GpioDataRegs.GPBSET.bit.GPIO44 = 1;
        Uint16 x;
        x = 0;
        if(1.2 < 2.3){
            x = 5;
        }
        GpioDataRegs.GPBCLEAR.bit.GPIO44 = 1;
    }
    
    //in test.c
    //gets called in main function loop
    void sampleFunction (void)
    {
        GpioDataRegs.GPBSET.bit.GPIO39 = 1;
        Uint16 x;
        x = 0;
        if(1.2 < 2.3){
            x = 5;
        }
        GpioDataRegs.GPBCLEAR.bit.GPIO39 = 1;
    }

    以下是该段的汇编代码:

    22 GpioDataRegs.GPBSET.BIO44 = 1;
    Cla1Task1()、c:
    0000a60a:78410000 MMOVIZ MR1、#0x0
    0000a60c:75807F0A MMOVZ16 MR0、@0x7f0a
    0000a60e:78811000 MMOVXI MR1、#0x1000
    0000a610:7C800004 MOR32 MR0、MR1、MR0
    0000a612:75C07F0A MMOV16 @0x7f0a、MR0
    24 x = 0;
    0000a614:78400000 MMOVIZ MR0、#0x0
    0000a616:75C08000 MMOV16 @0x8000、MR0
    26 x = 5;
    0000a618:78400000 MMOVIZ MR0、#0x0
    0000a61a:78800005 MMOVXI MR0、#0x5
    0000a61c:75C08000 MMOV16 @0x8000、MR0
    28 GpioDataRegs.GPBCLEAR.bit.GPIO44 = 1;
    0000a61e:78410000 MMOVIZ MR1、#0x0
    0000a620:78811000 MMOVXI MR1、#0x1000
    0000a622:75807F0C MMOVZ16 MR0、@0x7f0c
    0000a624:7C800004 MOR32 MR0、MR1、MR0
    0000a626:75C07F0C MMOV16 @0x7f0c、MR0
    29}

    另外、很抱歉、如果您仍在测试、但您是否有机会尝试上述其他2项结果:

    1) 1)我使用变量作为索引。

    例如:

    Uint16 i,x;
    
    i = 0;
    
    x = array1[i] + array2[i];

    array1[]和 array2[]是 float32全局变量并在 main.c 中初始化

    2) 2)设置数组位置的值

    例如:

    Uint16 i;
    
    i = 0;
    
    result[i]= 23.3 + 90.9;

    result []也是在 main.c 中初始化的 float32全局变量

    您在 最近的回复中回答的部分仅是我的第3点。

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

    您好、Casey、

    感谢您发布装配体。 我明天会查看并返回给您。 简单看一下、函数末尾的 GPIO 写入可能会增加开销。

    我建议使用下面链接中提到的方法、在这里使用 ePWM 来测量时钟周期内的执行。 通过查看汇编、可以调整时钟周期以考虑 ePWM 读取开销、从而获得精确的周期。 这将更容易与使用相同 ePWM 或 CPU timer0的 C28端类似性能评测进行比较。

    https://software-dl.ti.com/C2000/docs/cla_software_dev_guide/faq.html#how-can-i-measure-the-duration-of-a-task

    谢谢、
    Ashwini

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

    您好、Casey、

    我看了 C28和 CLA 上其中一个代码块(如下所示)的汇编代码。 行为差异来自指令集和架构-

    CLA 不支持将立即值移动到存储器的指令、它们被移动到寄存器中、寄存器被移动到存储器中。

    2. CLA 是一种浮点加速器,因此它没有针对整数进行优化。 如果将数据类型更改为浮点、则可能会看到更好的性能。

    我在这里复制了我查看过的一段代码的 C 代码和汇编代码段。

    您可以对其他代码片段进行类似的练习、以了解 CLA 和 C28上的执行差异。

    CLA 的指令集可在器件 TRM 中找到

    2. C28的指令集可在以下两个文档中找到:

    https://www.ti.com/lit/spru430

    https://www.ti.com/lit//spruhs1

    此外、为了在 CLA 和 C28上实现良好的性能、建议将优化旋转至至少 O2。

    C 代码:

    uint16 x =0;

       if (1.2 < 2.3){

          X = 5;

       }

    C28组装:3个周期

    ;--------------------------------------------------------------
    ; 64 | uint16 x = 0;                                                          
    ;--------------------------------------------------------------
           MOV      *- SP[5]、#0           ;2p 周期
    ;--------------------------------------------------------------
    ; 66 | if (1.2 < 2.3){                                                         
    ;--------------------------------------------------------------
    ;--------------------------------------------------------------
    ; 68 | x = 5;                                                                 
    ;--------------------------------------------------------------
           MOVB     *-SP[5]、#5、UNC       1周期

    CLA 汇编:5个周期

    ;--------------------------------------------------------------
    ; 69 | uint16 x =0;                                                           
    ;--------------------------------------------------------------
           MMOVIZ   MR0、#0               ;1个周期
           MMOV16   @_CLA_ACI_ctrlLoop sp+2、MR0;1个周期
    ;--------------------------------------------------------------
    ; 71 | if (1.2 < 2.3){                                                         
    ;--------------------------------------------------------------
    ;--------------------------------------------------------------
    ; 73 | x = 5;                                                                 
    ;--------------------------------------------------------------
           MMOVIZ   MR0、#0               ;1个周期
           MMOVXI   MR0、#5               ;1个周期
           MMOV16   @_CLA_ACI_ctrlLoop sp+2、MR0;1个周期

    谢谢、
    Ashwini