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.

C6747使用mathlib.lib优化程序执行时间的一些以疑问

Other Parts Discussed in Thread: MATHLIB

新手采用C6747进行替代F28335进行编程,但是程序执行时间不太理想,现在在主程序内添加100个两个单精度浮点变量相乘的算式,测量结果为一个乘法执行时间为40ns(主中断频率为300Mhz,程序和数据都存储在L2中)

期望进一步优化浮点乘法、以及其他算法的执行时间,否则现在的运行速度难以满足我的需要。希望能够指导是不是我在哪遇到了问题:

1、最理想的情况下一个单精度浮点乘法的执行时间应该是多少?

2、有专用的乘法指令么,还是用*来写,比如Data1*Data2,这种写法能够调用到FPU来进行浮点运算的优化处理 么?

3、关于mathlib.lib,我是应该添加mathlib.lib还是应该添加mathlib.ae674,我看到有的书里写到*.ae674是新的库文件格式

4、关于mathlib.lib的头文件问题,mathlib.h指向了很多子文件夹的*.h文件,这些都是需要添加的么?

5、添加mathlib.lib后,math.h中的函数也会调用mathlib.lib对算法进行优化么?浮点乘法也会受益吗?

6、如何确认自己的L1、L2是打开的,在仿真状态下,发现相关寄存器无法查看

  • 单精度浮点乘法指令的执行时间是Four-Cycle Instructions。

    C674x要用浮点功能的话,编译选项选择-mv6740。

    mathlib.ae674是真正的ELF 库,mathlib.lib是个链接库,添加mathlib.lib就可以了。

    .h文件可以根据编译时是否报错来添加。

    mathlib库里的函数都是优化过的。

    看一下有没有CACHE_setL1PSize CACHE_setL1DSize CACHE_setL2Size来设置L1, L2。也可以查看一下L2CFG寄存器。

    请使用优化选项-o2或者-o3看代码执行时间是否有改善?
  • 非常感谢,我尝试将编译选项从6740改为-mv 6740,但是无法生成.map和.out文件
    其他的都是一些warning,主要的错误故障如下:
    "C:\Users\DUPENG~1\AppData\Local\Temp\0666810", ERROR! at line 263:
    [E0800]
    Instruction invalid for C6200
    DINT

    "C:\Users\DUPENG~1\AppData\Local\Temp\0666810", ERROR! at line 307:
    [E0800]
    Instruction invalid for C6200
    DINT

    "C:\Users\DUPENG~1\AppData\Local\Temp\0666810", ERROR! at line 316:
    [E0800]
    Instruction invalid for C6200
    RINT

    "C:\Users\DUPENG~1\AppData\Local\Temp\0666810", ERROR! at line 545:
    [E0800]
    Instruction invalid for C6200
    DINT

    "C:\Users\DUPENG~1\AppData\Local\Temp\0666810", ERROR! at line 589:
    [E0800]
    Instruction invalid for C6200
    DINT

    "C:\Users\DUPENG~1\AppData\Local\Temp\0666810", ERROR! at line 598:
    [E0800]
    Instruction invalid for C6200
    RINT


    Errors in Source - Assembler Aborted
    6 Assembly Errors, No Assembly Warnings

    >> Compilation failure
    gmake: *** [SOURCE/DMC_C6747_H_Interrupt.obj] Error 1
    'Building file: ../SOURCE/DMC_C6747_H_PWM_Drive.c'
    'Invoking: C6000 Compiler'
    "c:/ti/ccsv6/tools/compiler/c6000_7.4.8/bin/cl6x" -mv-mv6740 --abi=coffabi -g --include_path="C:/Data/CCS_WorkSpace_v6_C6000/DMC_C6747_Parallel_2L_20190501" --include_path="C:/Data/CCS_WorkSpace_v6_C6000/DMC_C6747_Parallel_2L_20190501/INCLUDE" --include_path="c:/ti/ccsv6/tools/compiler/c6000_7.4.8/include" --diag_warning=225 --fp_mode=strict --preproc_with_compile --preproc_dependency="SOURCE/DMC_C6747_H_PWM_Drive.pp" --obj_directory="SOURCE" "../SOURCE/DMC_C6747_H_PWM_Drive.c"

    另外,开启浮点功能后,浮点乘法的计算就会加快是么?
  • 您好,今天晚上继续进行了测试,发现编译选项改为-mv6740是不对的,我尝试将编译选项改为6740-mv,发现并不报错,可以生成编译文件,不知道对不对

    但是修改之后,发现对于我的程序执行时间并没有优化作用,于是我采用以下代码进行了程序的执行时间测试:

    Data1=Data2*Data3;
    for(i=0;i<1000;i++)
    {
    Data1=Data2*Data3;
    }
    Data1=Data2*Data3;

    大约1个乘法的执行时间为30.5个时钟周期,且跟数据的类型并无关系,由此可以先排除了是代码定点/浮点的影响

    非常怀疑是我CMD文件的写法,或者是L1,L2的写法有错误,以下是我CMD文件的内容:

    -stack 0x00001000 /* Stack Size */
    -heap 0x00001000 /* Heap Size */


    MEMORY
    {
    DSPL2ROM: o = 0x00700000 l = 0x00100000 /* 1MB L2 Internal ROM */
    DSPL2RAM: o = 0x00800000 l = 0x0003F100 /* 256kB L2 Internal RAM */
    DSPL1PRAM: o = 0x00E00000 l = 0x00008000 /* 32kB L1 Internal Program RAM */
    DSPL1DRAM: o = 0x00F00000 l = 0x00008000 /* 32kB L1 Internal Data RAM */
    SHDSPL2ROM: o = 0x11700000 l = 0x00100000 /* 1MB L2 Shared Internal ROM */
    SHDSPL2RAM: o = 0x11800000 l = 0x00040000 /* 256kB L2 Shared Internal RAM */
    SHDSPL1PRAM: o = 0x11E00000 l = 0x00008000 /* 32kB L1 Shared Internal Program RAM */
    SHDSPL1DRAM: o = 0x11F00000 l = 0x00008000 /* 32kB L1 Shared Internal Data RAM */
    EMIFASDRAM: o = 0x40000000 l = 0x08000000 /* 64MB SDRAM Data (CS0) */
    EMIFACS2: o = 0x60000000 l = 0x02000000 /* 32MB Async Data (CS2) */
    EMIFACS3: o = 0x62000000 l = 0x02000000 /* 32MB Async Data (CS3) */
    EMIFACS4: o = 0x64000000 l = 0x02000000 /* 32MB Async Data (CS4) */
    EMIFACS5: o = 0x66000000 l = 0x02000000 /* 32MB Async Data (CS5) */
    VECS2: o = 0x80000000 l = 0x00000F00 /* 128kB Shared RAM */
    SHRAM: o = 0x80000F00 l = 0x0001F100 /* 128kB Shared RAM */
    EMIFBSDRAM: o = 0xC0000000 l = 0x10000000 /* 256MB SDRAM Data */
    }

    SECTIONS
    { ".vectors" > VECS2
    .bss > DSPL2RAM
    .cinit > DSPL2RAM
    .cio > DSPL2RAM
    .const > DSPL2RAM
    .stack > DSPL2RAM
    .sysmem > DSPL2RAM
    .text > DSPL2RAM
    .switch > DSPL2RAM
    .far > DSPL2RAM

    }

    至于在寄存器组里,无法查看L1、L2相关寄存器组……

  • 请按照下图修改。

  • 非常感谢您的回复,我已按照图中进行设置,但是对于程序执行时间进行改善,我编写了以下代码进行代码执行时间测试:

    int i = 0;

    int Data_I1 = 1  , Data_I2 = 2  , Data_I3 = 3  ;

    float Data_f1 = 1.0, Data_f2 = 2.0, Data_f3 = 3.0;

    asm( " NOP 1 " );

    for(i=0;i<1000;i++) asm( " NOP 1 " );

    asm( " NOP 1 " );

    for(i=0;i<1000;i++) Data_I3=Data_I1+Data_I2; //Int +

    asm( " NOP 1 " );

    for(i=0;i<1000;i++) Data_I3=Data_I1-Data_I2; //Int -

    asm( " NOP 1 " );

    for(i=0;i<1000;i++) Data_I3=Data_I1*Data_I2; //Int *

    asm( " NOP 1 " );

    for(i=0;i<1000;i++) Data_I3=Data_I1/Data_I2; //Int /

    asm( " NOP 1 " );

    for(i=0;i<1000;i++) Data_f3=Data_f1+Data_f2; //Float +

    asm( " NOP 1 " );

    for(i=0;i<1000;i++) Data_f3=Data_f1-Data_f2; //Float -

    asm( " NOP 1 " );

    for(i=0;i<1000;i++) Data_f3=Data_f1*Data_f2; //Float *

    asm( " NOP 1 " );

    for(i=0;i<1000;i++) Data_f3=Data_f1/Data_f2; //Float /

    asm( " NOP 1 " );

    Breakpoint中采用Clock Count进行计时,每1000个指令的执行时间如下表所示:

    代码存放在DSPL2RAM

     

     

    未优化

    op-0

    op-3

    数据类型

    指令

    1000条执行时间

    1000条执行时间

    1000条执行时间

     

    asm( " NOP 1 " );

    10284

    9009

    8002

    Int

    23010

    8009

    1

    23010

    8009

    1

    26020

    8009

    1

    46031

    8009

    1

    Float

    26010

    8009

    1

    26010

    8009

    1

    26011

    8009

    1

    130047

    8009

    1

    优化等级选择如下:

     

    可看出,浮点与整形的执行时间都很长,都不合理,我觉得这个问题应该就是跟CMD中配置DSPL2RAM有关?但是如何进一步充分利用L1,L2来优化程序执行时间没有头绪,希望能给一定的意见,或者是我整个过程有什么其他的错误导致程序执行时间过长么?

  • 您好,我现在是采用中断的形式进行编程,没有采用BIOS,在CCS6的寄存器组中,看不到关于Cache相关的Reg,通过地址,我可以看到L1PCFG的值为0x0007,L1DCFG的值为0x0003,请问这个值对么,Cache该如何进一步配置,我找不到CACHE_L1SetSize();调用,是不是必须在BIOS中才可以使用?我的速度慢是因为Cache没有开到最大或者没有软件维护么?我应该在哪里找到相关的设置方法?
  • CACHE_L1SetSize这个函数在csl库里。先把cache使能看运行速度。

    另外,建议用TSCL,TSCH寄存器来计算代码执行时间。