📄 c6000软件优化经验总结(3).htm
字号:
<TBODY>
<TR>
<TD vAlign=top width=600>
<TABLE
style="BORDER-RIGHT: #cccccc 1px solid; BORDER-TOP: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; BORDER-BOTTOM: #cccccc 1px solid"
cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD>
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD
style="FONT-WEIGHT: bold; FONT-SIZE: 16px; PADDING-BOTTOM: 10px; COLOR: #00287b; LINE-HEIGHT: normal; PADDING-TOP: 15px; FONT-STYLE: normal; FONT-VARIANT: normal"
align=middle height=25>C6000软件优化经验总结(3)</TD></TR>
<TR>
<TD class=hight1 bgColor=#cccccc> </TD></TR>
<TR>
<TD align=middle
height=30>作者:佚名 来源:本站原创 点击数:95 更新时间:2006-2-22 文章录入:admin</TD></TR></TBODY></TABLE></TD></TR>
<TR>
<TD class=hanju><BR>
<P>九、</P>
<P>1、源程序</P>
<P> for (i = 0; i < n; i++)</P>
<P> {</P>
<P> max =
-32767;</P>
<P> for (j = 0; j
< n; j++)</P>
<P> {</P>
<P>
if (sub (tmp2[j], max) >= 0)</P>
<P>
{</P>
<P>
max = tmp2[j];</P>
<P>
ix = j;</P>
<P>
}</P>
<P>
}</P>
<P>
tmp2[ix] =
-32768;</P>
<P>
tmp[i] =
ix;</P>
<P> }</P>
<P>2、优化后的程序</P>
<P> if (n0>n1)
{temp=n0;n0=n1;n1=temp;}</P>
<P> if (n1>n2)
{temp=n1;n1=n2;n2=temp;}</P>
<P> if (n2>n3)
{temp=n2;n2=n3;n3=temp;}</P>
<P> if (n3>n4)
{temp=n3;n3=n4;n4=temp;}</P>
<P> if (n0>n1)
{temp=n0;n0=n1;n1=temp;}</P>
<P> if (n1>n2)
{temp=n1;n1=n2;n2=temp;}</P>
<P> if (n2>n3)
{temp=n2;n2=n3;n3=temp;}</P>
<P> if (n0>n1)
{temp=n0;n0=n1;n1=temp;}</P>
<P> if (n1>n2) {return n1;}</P>
<P>3、优化说明</P>
<P> 源程序也为一个求中值的问题,由于已知循环次数固定为5,因此将循环展开使用if语句直接求取中值。</P>
<P>十、</P>
<P>1、源程序</P>
<P>static Word16 Bin2int (Word16 no_of_bits, Word16
*bitstream)</P>
<P>{</P>
<P> Word16 value, i, bit;</P>
<P> </P>
<P> value = 0;</P>
<P> for (i = 0; i < no_of_bits; i++)</P>
<P> {</P>
<P> value = shl (value,
1);</P>
<P> bit =
*bitstream++;</P>
<P> if (sub (bit, BIT_1)
== 0)</P>
<P> value = add (value,
1);</P>
<P> }</P>
<P> return (value);</P>
<P>}</P>
<P> for (i = 0; i < prmno[mode]; i++)</P>
<P> {</P>
<P> prm[i] = Bin2int
(bitno[mode][i], bits);</P>
<P> bits +=
bitno[mode][i];</P>
<P> }</P>
<P>2、优化后的程序</P>
<P> value = 0;</P>
<P> bitsp = bits;</P>
<P> bitnop= &bitno[mode][0];</P>
<P> j = *bitnop++;</P>
<P> j1 = *bitnop++;</P>
<P> j2 = *bitnop++;</P>
<P> j3 = *bitnop++;</P>
<P> j4 = *bitnop++;</P>
<P> _nassert(loop[mode]>=35);</P>
<P> for (i = 0; i < loop[mode]; i++)</P>
<P> {</P>
<P> value = value*2 +
*bitsp++;</P>
<P> j--;</P>
<P> if (j == 0)</P>
<P> {</P>
<P>
*prm++ = value;</P>
<P>
value = 0;</P>
<P>
j = j1;</P>
<P> j1 =
j2;</P>
<P> j2 =
j3;</P>
<P> j3 =
j4;</P>
<P> j4 =
*bitnop++;</P>
<P> } </P>
<P> }</P>
<P>3、优化说明</P>
<P> 源程序按照数据位流定义取出参数,为双重循环结构,优化中采用重新根据位流的bit长度定义循环次数,化简为单重循环,然后优化循环,去除boundary,使pipeline的数目最小。</P>
<P>十一、copy程序的优化</P>
<P> 1、源代码:</P>
<P> Word16 i;</P>
<P> for (i = 0; i < L; i++)</P>
<P> {</P>
<P> y[i] = x[i];</P>
<P> }</P>
<P> 2、改编代码:</P>
<P>(1)要求数组长度能被2整除</P>
<P> Word32 i;</P>
<P> Word32 temp;</P>
<P> int *p1 = (int *)&x[0];</P>
<P> int *q1 = (int *)&y[0];</P>
<P> for (i = 0; i < L/2; i++)</P>
<P> {</P>
<P> temp = *p1++;</P>
<P> *q1++ = temp;</P>
<P> }</P>
<P>(2)要求数组长度能被4整除</P>
<P> Word32 i;</P>
<P> Word32 temp1, temp2;</P>
<P> Word32 *pin1, *pin2, *pout1, *pout2;</P>
<P> pin1 = (Word32 *)&x[0]; </P>
<P> pin2 = (Word32 *)&x[2]; </P>
<P> pout1= (Word32 *)&y[0]; </P>
<P> pout2= (Word32 *)&y[2]; </P>
<P> for (i = 0; i < L/4; i++)</P>
<P> {</P>
<P> temp1 = *pin1;</P>
<P> temp2 = *pin2;</P>
<P> pin1+=2;</P>
<P> pin2+=2;</P>
<P> *pout1= temp1;</P>
<P> *pout2= temp2;</P>
<P> pout1+=2;</P>
<P> pout2+=2;</P>
<P> }</P>
<P>3、优化方法说明:</P>
<P>把一次循环拷贝一个word16的数改为一次循环拷贝2个word16或4个word16的数。</P>
<P>4、技巧:</P>
<P>充分利用c6xx一次读取32位数的特性,并利用一个指令周期能读取两个数据的特点。</P>
<P>十二、set_zero程序的优化</P>
<P> 1、源代码:</P>
<P> Word16 i;</P>
<P> for (i = 0; i < L; i++)</P>
<P> {</P>
<P> x[i] = 0; </P>
<P> }</P>
<P> 2、改编代码:</P>
<P>(1)数组长度能被2整除</P>
<P> Word32 i;</P>
<P> int *x1 = (int *)&x[0];</P>
<P> for (i = 0; i < L/2; i++)</P>
<P> {</P>
<P> *x1++ = 0;</P>
<P> }</P>
<P>(2)数组长度能被4整除</P>
<P> Word32 i;</P>
<P> int *x1 = (int *)&x[0];</P>
<P> int *x2 = (int *)&x[2];</P>
<P> for (i = 0; i < L/4; i++)</P>
<P> {</P>
<P> *x1 = 0;</P>
<P> *x2 = 0;</P>
<P> x1++;</P>
<P> x2++; </P>
<P> x1++;</P>
<P> x2++; </P>
<P> }</P>
<P>3、优化方法说明:</P>
<P>把一次循环为一个word16的数赋值改为一次为2个或4个word16的数赋值。</P>
<P>4、技巧:</P>
<P>充分利用C6XX一次读取32位数的特点,并利用一个指令周期能读取两个数据的特点。</P>
<P>十三、32bit数与16bit数相乘</P>
<P>1、源代码:</P>
<P>L_tmp0 = Mac_32_16(L_32, hi1, lo1, lo2);</P>
<P>2、改编代码:</P>
<P>L_tmp0=_sadd(_sadd(_smpyhl(hl32, lo2), </P>
<P> (_mpyus(hl32, lo2)>>16)<<1), L_32);</P>
<P>3、优化方法说明:</P>
<P> hl32是32bit的数,hi1和lo1是16bit的数,且 hl32 = hi 1<<16 + lo1
<< 1 ,即hi1和lo1分别是hl32的高16位数和低16位数。</P>
<P> 函数Mac_32_16(L_32, hi1, lo1, lo2)实现</P>
<P> L_32 = L_32 + (hi1*lo2)<<1 +
((lo1*lo2)>>15)<<1</P>
<P> 源代码是把一个32位的数拆成两个16位的数与一个16位的数相乘,优化后的代码不拆开32位的数,直接用32位的数与16位的数相乘。运用这种方法必须保证hl32的最低一位数必须为0,否则应用指令_clr(hl32,
0, 0)把最低位清零。</P>
<P>4、技巧:</P>
<P> 源代码中的低16位数lo1是hl32的低16位右移一位得到的(留出一位符号位)。在与lo2相乘时又右移了15位,所以在改编代码中右移16位,并且是以无符号数与lo2相乘。</P>
<P>十四、32bit数与32bit数相乘</P>
<P>1、源代码:</P>
<P>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -