?? 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 + -