新手采用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是打开的,在仿真状态下,发现相关寄存器无法查看
Shine:
单精度浮点乘法指令的执行时间是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看代码执行时间是否有改善?
user1947039:
回复 Shine:
非常感谢,我尝试将编译选项从6740改为-mv 6740,但是无法生成.map和.out文件
其他的都是一些warning,主要的错误故障如下:
"C:\Users\DUPENG~1\AppData\Local\Temp\0666810", ERROR!at line 263:[E0800]Instruction invalid for C6200DINT"C:\Users\DUPENG~1\AppData\Local\Temp\0666810", ERROR!at line 307:[E0800]Instruction invalid for C6200DINT
"C:\Users\DUPENG~1\AppData\Local\Temp\0666810", ERROR!at line 316:[E0800]Instruction invalid for C6200RINT
"C:\Users\DUPENG~1\AppData\Local\Temp\0666810", ERROR!at line 545:[E0800]Instruction invalid for C6200DINT
"C:\Users\DUPENG~1\AppData\Local\Temp\0666810", ERROR!at line 589:[E0800]Instruction invalid for C6200DINT
"C:\Users\DUPENG~1\AppData\Local\Temp\0666810", ERROR!at line 598:[E0800]Instruction invalid for C6200RINT
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"另外,开启浮点功能后,浮点乘法的计算就会加快是么?
user1947039:
回复 Shine:
您好,今天晚上继续进行了测试,发现编译选项改为-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相关寄存器组……
Shine:
回复 user1947039:
请按照下图修改。
user1947039:
回复 Shine:
非常感谢您的回复,我已按照图中进行设置,但是对于程序执行时间进行改善,我编写了以下代码进行代码执行时间测试:
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来优化程序执行时间没有头绪,希望能给一定的意见,或者是我整个过程有什么其他的错误导致程序执行时间过长么?
user1947039:
回复 Shine:
您好,我现在是采用中断的形式进行编程,没有采用BIOS,在CCS6的寄存器组中,看不到关于Cache相关的Reg,通过地址,我可以看到L1PCFG的值为0x0007,L1DCFG的值为0x0003,请问这个值对么,Cache该如何进一步配置,我找不到CACHE_L1SetSize();调用,是不是必须在BIOS中才可以使用?我的速度慢是因为Cache没有开到最大或者没有软件维护么?我应该在哪里找到相关的设置方法?
Shine:
回复 user1947039:
CACHE_L1SetSize这个函数在csl库里。先把cache使能看运行速度。
另外,建议用TSCL,TSCH寄存器来计算代码执行时间。
TI中文支持网






