以文本方式查看主题 - 曙海教育集团论坛 (http://sun4.cn/bbs/index.asp) -- DSP6000系统开发 (http://sun4.cn/bbs/list.asp?boardid=29) ---- TMS320C6000嵌入式系统优化编程的研究 (http://sun4.cn/bbs/dispbbs.asp?boardid=29&id=1624) |
-- 作者:wangxinxin -- 发布时间:2010-11-22 14:08:03 -- TMS320C6000嵌入式系统优化编程的研究 使用汇编语言进行编程时特别需要注意的是C6000指令的延迟情况,有些指令并不是立刻就能得到结果。C6000指令集中有延迟的指令如表1所示。 表1 C6000的有延迟指令 例1 32位归一化函数morm_1() short morm_1(long L_var1) {short var_out; if (L_var1= = 0L){ var_out = (short)0; } else { if (L_var1= = (logn)0xffffffffL{ var_out = (short)31; } else { if (L_var1< 0L) { L_var1 = ~L_var1; } for(var_out=(short)0;L_var1<(long)0x40000000L; var_out++){ L_var1 <<= 1L; }}} return(var_out); } 使用汇编语言进行优化; .global norm_1 _norm1: B B3 CMPEQ 0,A4,B0 [!B0] NORM A4,A4 NOP 3 消耗时间(时钟周期):C语言norm_1()为723;汇编语言为11。 2.2 使用线性汇编语言重写整个函数 对于某些以循环体为主的函数可以使用线性汇编语言重写整个函数。使用汇编优化器进行优化之后,效率是非常高的。 下面例子是算法中计算帧能量的函数,其中包含两个单循环体。进行优化时,首先要确定循环的次数。对于循环次数是变量的情况,优化器不进行并行优化;其次尽量减少数据存取次数,例如以32位存取指令对16位数据进行存取,可以节省一增的存取周期。仔细观察C代码,会发现两次循环次数相同。第二个循环要用到第一个循环的结果,因此可以将两个循环合并在一起,这样就避免了在第二个循环中再从存储器中取结果,减少了一半的Load操作。 Long Comp_En(short *Dpnt) { int i; long Rez; short Temp[60]; for (i=0;i<60;i ++) Temp [i] = shr(Dpnt[i],(short) 2); Rez=(long) 0; for (i=0; i <60; i ++) Rez=L_mac(Rez,Temp[i],Temp[i]); return Rez; } 相应的线性汇编程序如下: .global _Comp_En ;函数名定义,对c变量前加_ _Comp_En .cproc Dpnt;函数头定义,Dpnt是参数 .reg Rez,Rez1,Rez2,1 ;寄存器定义,不必考虑实际的寄存器分配 .reg t1,t2,x1,c1,m1,m2 zero Rez zero Rez1 zero Rez2 mv Dpnt,c1 mvk 30,i ;确定循环次数。因为用LDW代替LDH,循五环次数减少一半。 loop1 .trip 30 ldw *c1++,x1 sh1 x1,16,t1 shr t1,2,t1 shr x1,2,t2 ;将两个循环合在一起,又减少了一半的从内存取数据的时间。 smpyh t1,t1,m1 smpyh t2,t2,m2 sadd Rez1,m1,Rez1 sadd Rez2,m2,Rez2 [i] sub i,1,i ;循环计数器从30递减 [i] b loop1 sadd Rez1,Rez2,Rez .return Rez .endproc 消耗时间(时钟周期):C语言为32971;线性汇编语言为93。 2.3 使用线性汇编改写复杂函数中的循环体 当函数的逻辑关系复杂,判断、跳转、函数调用情况特别多时,上面方法的效果就会在打折扣。这时可以使用线性汇编将其中的循环部分改写成一个函数,以优化后的函数调用代替环部分,而不是优化整个复杂函数。 高速数字信号处理器件的应用范围越来越广,特别是在移动通信领域中,软件无线电、智能天线等新技术的实都需要强大的实时数字信号处理的支持。TMS320C6000系列DSP完全可以满足此类要求。但目前对于并行DSP技术的软硬件开发还处在摸索阶段,如何充分利用高速DSP的资源,是这方面的研究重点。本文研究了最新推出的TMS320C6000的优化策略,从工程和系统的角度总结出一套既能满足实时性又能保证开发时效性的实用的优化编程方法,以供分飨。 |