TI-DM642优化相关.doc_第1页
TI-DM642优化相关.doc_第2页
TI-DM642优化相关.doc_第3页
TI-DM642优化相关.doc_第4页
TI-DM642优化相关.doc_第5页
已阅读5页,还剩1页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

十一、copy程序的优化1、源代码:Word16 i;for (i = 0; i L; i+)yi = xi;2、改编代码:(1)要求数组长度能被2整除Word32 i;Word32 temp;int *p1 = (int *)&x0;int *q1 = (int *)&y0;for (i = 0; i L/2; i+)temp = *p1+;*q1+ = temp;(2)要求数组长度能被4整除Word32 i;Word32 temp1, temp2;Word32 *pin1, *pin2, *pout1, *pout2;pin1 = (Word32 *)&x0; pin2 = (Word32 *)&x2; pout1= (Word32 *)&y0; pout2= (Word32 *)&y2; for (i = 0; i L/4; i+)temp1 = *pin1;temp2 = *pin2;pin1+=2;pin2+=2;*pout1= temp1;*pout2= temp2;pout1+=2;pout2+=2;3、优化方法说明:把一次循环拷贝一个word16的数改为一次循环拷贝2个word16或4个word16的数。4、技巧:充分利用c6xx一次读取32位数的特性,并利用一个指令周期能读取两个数据的特点。十二、set_zero程序的优化1、源代码:Word16 i;for (i = 0; i L; i+)xi = 0; 2、改编代码:(1)数组长度能被2整除Word32 i;int *x1 = (int *)&x0;for (i = 0; i L/2; i+)*x1+ = 0;(2)数组长度能被4整除Word32 i;int *x1 = (int *)&x0;int *x2 = (int *)&x2;for (i = 0; i 16)1), L_32);3、优化方法说明:hl32是32bit的数,hi1和lo1是16bit的数,且 hl32 = hi 116 + lo1 1 ,即hi1和lo1分别是hl32的高16位数和低16位数。函数Mac_32_16(L_32, hi1, lo1, lo2)实现L_32 = L_32 + (hi1*lo2)15)16)16)1), L_32);3、优化方法说明:两个32位的数相乘,不必分成四个16位的数相乘,直接用32位相乘。其中:hl1_32 = hi116 + lo11, hl2_32 = hi2 16 + lo2 1 。源代码实现: L_32 = L_32 + (hi1*hi2)15 + (lo1*hi2)15 )14、技巧:低16位与高16位相乘时,低16位使用的是无符号数。 十五、16位除法的优化1、源代码:Word16 div_s (Word16 var1, Word16 var2) /实现 var1/var2Word16 var_out = 0;Word16 iteration;Word32 L_num = (Word32)var1;Word32 L_denom = (Word32)var2;for (iteration = 0; iteration 15; iteration+)var_out = 1;L_num = L_denom)L_num = L_sub (L_num, L_denom);var_out = add (var_out, 1);return (var_out);2、改编代码:Word16 div_s1 (Word16 var1, Word16 var2)Word32 var1int;Word32 var2int;var1int = var1 16;var2int = var2 15;var1int = _subc(var1int,var2int);var1int = _subc(var1int,var2int);var1int = _subc(var1int,var2int);var1int = _subc(var1int,var2int);var1int = _subc(var1int,var2int);var1int = _subc(var1int,var2int);var1int = _subc(var1int,var2int);var1int = _subc(var1int,var2int);var1int = _subc(var1int,var2int);var1int = _subc(var1int,var2int);var1int = _subc(var1int,var2int);var1int = _subc(var1int,var2int);var1int = _subc(var1int,var2int);var1int = _subc(var1int,var2int);var1int = _subc(var1int,var2int);return (var1int & 0xffff);3、优化方法说明:实现16位的除法,要求被除数var1和除数var2都是整数,且var1=var2。利用C6XX特有的指令subc,实现除法的循环移位相减操作。4、技巧:把被除数和除数都转换成32位数来操作,返回时取低16位数。 十六、C6X优化inline举例:1、原程序:for (i = LO_CHAN; i ch_noisei);Ltmp = L_shl(st-ch_noisei, norm_shift);norm_shift1 = norm_l(st-ch_enrgi);Ltmp3 = L_shl1(st-ch_enrgi, norm_shift1 - 1);Ltmp2 = L_divide(Ltmp3, Ltmp);Ltmp2 = L_shr(Ltmp2, 27 - 1 + norm_shift1 - norm_shift); / * scaled as 27,4 *if (Ltmp2 = 0)Ltmp2 = 1;Ltmp1 = fnLog10(Ltmp2);Ltmp3 = L_add(Ltmp1, LOG_OFFSET - 80807124); / * -round(log10(24)*226 *Ltmp2 = L_mult(TEN_S5_10, extract_h(Ltmp3);if (Ltmp2 0)Ltmp2 = 0;/ * 0.1875 scaled as 10,21 *Ltmp1 = L_add(Ltmp2, CONST_0_1875_S10_21);/ * tmp / 0.375 2.667 scaled as 5,10, Ltmp is scaled 15,16 *Ltmp = L_mult(extract_h(Ltmp1), CONST_2_667_S5_10);ch_snri = extract_h(Ltmp);*/2、优化后程序:/因循环体太大,拆成两个循环并把相应的函数内嵌以使程序能pipeline,/用L_div_tmp保存因拆分而产生的中间变量。for (i = LO_CHAN; i ch_noisei);norm_shift = _norm(st-ch_noisei);Ltmp = _sshl(st-ch_noisei, norm_shift);/norm_shift1 = norm_l(st-ch_enrgi); norm_shift1 = _norm(st-ch_enrgi); /Ltmp3 = L_shl1(st-ch_enrgi, norm_shift1 - 1);LLtmp1 = st-ch_enrgi; LLtmp1 = LLtmp1 8);Ltmp2 = IL_divide(Ltmp3, Ltmp);/Ltmp2 = L_shr(Ltmp2, 27 - 1 + norm_shift1 - norm_shift); Ltmp2 = (Ltmp2 (27 - 1 + norm_shift1 - norm_shift);if (Ltmp2 = 0)Ltmp2 = 1;L_div_tmpi = Ltmp2;for (i = LO_CHAN; i 16);if (Ltmp2 16), CONST_2_667_S5_10); /ch_snri = extract_h(Ltmp);ch_snri = (Ltmp 16);3、优化说明观察上面这个循环,循环体本身比较大,且含有两个函数L_divide()和fnLog10(),而C62内部只有32个寄存器,且有些寄存器是系统用的,如B14、B15这样循环体太大将会导致寄存器不够分配,从而导致系统编译器无法实现循环的pipeline。为了实现循环的pipeline。我们需要把循环体进行拆分,拆分时要考虑以下几点:(1)、拆分成几个循环比较合适?在各个循环能pipeline的前提下,拆开的循环个数越少越好。这就要求尽可能让各个循环的运算量接近。(2)考虑在什么地方把程序拆开比较合适?循环体里的数据流往往并不是单一的,在拆开的断点处势必要用中间变量保存上次的循环运算结果,供以后的循环用。适当的拆开循环体,使所需的中间变量越少越好。(3)循环体中的函数调用必须定义成内嵌形式,含有函数调用的循环系统是无法使之pipeline的;各个循环体中的判断分支机构不可太多,否则系统也无法使之pipeline,为此应近可能把可以确定下来的分支确定下来,并尽可能用内嵌指令。 针对上面这个例子,考虑:(1)为让各个循环的运算量大致相当,应把L_divide()和fnLog10()分到两个循环中去,从循环体大小上考虑,估计拆成两个循环比较合适。(2)考虑在什么地方把程序拆开比较合适?在if (Ltmp2 = 0)Ltmp2 = 1;后拆开,因为后面用到的数据只有Ltmp2,故只需用一个数组保存每次循环的Ltmp2值即可。(3)循环体中的两处函数调用L_divide()和fnLog10()都定义了其内嵌形式,IL_divide()和IfnLog1

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论