最近刚刚接触C6748,目前主要测试C6748的运行速度问题,已决定是否取代现有的28335,应用时主频456M,L1作为Cache,程序放在L2中,优化o3,查看TI自带的Delay函数时,发现其汇编代码单步运行时,每步需要6个时钟周期,请问这种运行速度是否正常?
ps:之前一直在用28335,相同的程序在28335中运行大概需要2.4us,在C6748中需要1.5us,C6748的运行速度貌似并没有想象中的强大,有什么途径可以改善呢?
以下为Delay函数的汇编代码:
Delay:
118040c0: 07BF005A SUB.L2 SP,8,SP
118040c4: AC45 STW.D2T1 A4,*B15[1]
371 while(delay–);
118040c6: BC4D LDW.D2T2 *B15[1],B4
118040c8: FDA6 MVK.L1 -1,A3
118040ca: FEA7 MVK.L2 -1,B5
118040cc: 2C6E NOP 2
118040ce: EE41 ADD.L2 B4,-1,B4
118040d0: BC45 STW.D2T2 B4,*B15[1]
118040d2: BC4D LDW.D2T2 *B15[1],B4
118040d4: 6C6E NOP 4
118040d6: 86E9 CMPEQ.L2 B4,B5,B0
118040d8: 202CA121 [ B0] BNOP.S1 $C$DW$L$Delay$0$3$E (PC+88 = 0x11804118),5
118040dc: E7C00000 .fphead n, l, W, BU, nobr, nosat, 0111110
118040e0: 3000A35A || [!B0] MVK.L2 0,B0
Tony Tang:
自带的delay函数是啥样的啊?
上面汇编里没一条指令是并行的,需要多少周期直接数就行了。-o3是对C代码优化,如果这个delay里加了汇编的nop,则对-O几没作用。如果没有汇编nop,加优化后,这种delay函数直接就被优化没了。delay肯定是希望达到真正的delay目的,而且时间相对要有确定性,不能因为加不加优化变化很大吧,比如本来想延时一ms,一优化变成1us,那也不是想要的结果啊。
上面的比法,还是在比频率。
要比的话,最好写一段真正的算法,比如一个简单的乘累加循环,加优化编译。
下面链接是C6000的优化教程,非常好。有兴趣可以看看:
http://processors.wiki.ti.com/index.php/TMS320C6000_DSP_Optimization_Workshop
user1553532:
回复 Tony Tang:
谢谢您的回答;
Dealy函数是这样的:
static void Delay(volatile unsigned long delay){ while(delay–);}
上面的汇编程序与这个函数是对应的,因为单步运行的时候发现执行一条汇编指令需要6个时钟周期,请问这是否正常?
Denny%20Yang99373:
回复 user1553532:
具体到某条指令可能6个或者更对的时钟周期是有可能的,还要看具体指令,如果从DDR取数,可能时钟周期更多。
优化好主要是增加并行度,比如8条指令同时执行,这样速度就起来了。
Tony Tang:
回复 user1553532:
通过simulator可以看到,一条nop只运行了一个clock,而硬件仿真时是6 cycle,所以这个额外的时间是由于内存的延时造成的.
user1553532:
回复 Tony Tang:
谢谢回答
请问内存的延时可以减小或者避免吗?
Tony Tang:
回复 user1553532:
如果是外部内存DDR等,Cache可以减少内存的延时,但目前已经是在L2上跑了,所以这个延时没法减少了。