⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 c6000软件优化经验总结(3).htm

📁 dsp优化方法以及实际例程,ti dsp c6000系列
💻 HTM
📖 第 1 页 / 共 4 页
字号:
            L_tmp = Mac_32&nbsp;&nbsp; (L_32, hi1, lo1, hi2, lo2);</P>
            <P>2、改编代码:</P>
            <P>&nbsp;L_tmp = _sadd(_sadd(_smpyh(hl1_32, hl2_32),</P>
            <P>&nbsp;&nbsp;&nbsp;((_mpyhslu(hl1_32, 
            hl2_32)&gt;&gt;16)&lt;&lt;1)+</P>
            <P>&nbsp;&nbsp;&nbsp;((_mpyhslu(hl2_32, 
            hl1_32)&gt;&gt;16)&lt;&lt;1)), L_32);</P>
            <P>3、优化方法说明:</P>
            <P>&nbsp;两个32位的数相乘,不必分成四个16位的数相乘,直接用32位相乘。其中:</P>
            <P>&nbsp;&nbsp;hl1_32 = hi1&lt;&lt;16 + 
            lo1&lt;&lt;1,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hl2_32 = hi2 
            &lt;&lt;16 + lo2 &lt;&lt;1 。</P>
            <P>源代码实现: L_32 = L_32 + (hi1*hi2)&lt;&lt;1 + ( (hi1*lo2)&gt;&gt;15 + 
            (lo1*hi2)&gt;&gt;15 )&lt;&lt;1</P>
            <P>4、技巧:</P>
            <P>低16位与高16位相乘时,低16位使用的是无符号数。</P>
            <P>十五、16位除法的优化</P>
            <P>1、源代码:</P>
            <P>Word16 div_s (Word16 var1, Word16 var2)&nbsp;//实现&nbsp; 
            var1/var2</P>
            <P>{</P>
            <P>&nbsp;&nbsp;&nbsp; Word16 var_out = 0;</P>
            <P>&nbsp;&nbsp;&nbsp; Word16 iteration;</P>
            <P>&nbsp;&nbsp;&nbsp; Word32 L_num = (Word32)var1;</P>
            <P>&nbsp;&nbsp;&nbsp; Word32 L_denom = (Word32)var2;</P>
            <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
            for (iteration = 0; iteration &lt; 15; iteration++)</P>
            <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
            {</P>
            <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
            var_out &lt;&lt;= 1;</P>
            <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
            L_num &lt;&lt;= 1;</P>
            <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
            if (L_num &gt;= L_denom)</P>
            <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
            {</P>
            <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
            L_num = L_sub (L_num, L_denom);</P>
            <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
            var_out = add (var_out, 1);</P>
            <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
            }</P>
            <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
            }</P>
            <P>&nbsp;&nbsp;&nbsp; return (var_out);</P>
            <P>}</P>
            <P>2、改编代码:</P>
            <P>Word16 div_s1 (Word16 var1, Word16 var2)</P>
            <P>{</P>
            <P>&nbsp;&nbsp;&nbsp; Word32 var1int;</P>
            <P>&nbsp;&nbsp;&nbsp; Word32 var2int;</P>
            <P>&nbsp;&nbsp;&nbsp; var1int = var1 &lt;&lt; 16;</P>
            <P>&nbsp;&nbsp;&nbsp; var2int = var2 &lt;&lt; 15;</P>
            <P>&nbsp;&nbsp;&nbsp; var1int = _subc(var1int,var2int);</P>
            <P>&nbsp;&nbsp;&nbsp; var1int = _subc(var1int,var2int);</P>
            <P>&nbsp;&nbsp;&nbsp; var1int = _subc(var1int,var2int);</P>
            <P>&nbsp;&nbsp;&nbsp; var1int = _subc(var1int,var2int);</P>
            <P>&nbsp;&nbsp;&nbsp; var1int = _subc(var1int,var2int);</P>
            <P>&nbsp;&nbsp;&nbsp; var1int = _subc(var1int,var2int);</P>
            <P>&nbsp;&nbsp;&nbsp; var1int = _subc(var1int,var2int);</P>
            <P>&nbsp;&nbsp;&nbsp; var1int = _subc(var1int,var2int);</P>
            <P>&nbsp;&nbsp;&nbsp; var1int = _subc(var1int,var2int);</P>
            <P>&nbsp;&nbsp;&nbsp; var1int = _subc(var1int,var2int);</P>
            <P>&nbsp;&nbsp;&nbsp; var1int = _subc(var1int,var2int);</P>
            <P>&nbsp;&nbsp;&nbsp; var1int = _subc(var1int,var2int);</P>
            <P>&nbsp;&nbsp;&nbsp; var1int = _subc(var1int,var2int);</P>
            <P>&nbsp;&nbsp;&nbsp; var1int = _subc(var1int,var2int);</P>
            <P>&nbsp;&nbsp;&nbsp; var1int = _subc(var1int,var2int);</P>
            <P>&nbsp;&nbsp;&nbsp; return (var1int &amp; 0xffff);</P>
            <P>}</P>
            <P>3、优化方法说明:</P>
            <P>实现16位的除法,要求被除数var1和除数var2都是整数,且var1&lt;=var2。利用C6XX特有的指令subc,实现除法的循环移位相减操作。</P>
            <P>4、技巧:</P>
            <P>把被除数和除数都转换成32位数来操作,返回时取低16位数。</P>
            <P>十六、C6X优化inline举例:</P>
            <P>1、原程序:</P>
            <P>&nbsp;for (i = LO_CHAN; i &lt;= HI_CHAN; i++)</P>
            <P>&nbsp;{</P>
            <P>&nbsp;</P>
            <P>&nbsp;&nbsp;norm_shift = norm_l(st-&gt;ch_noise[i]);</P>
            <P>&nbsp;&nbsp;Ltmp = L_shl(st-&gt;ch_noise[i], norm_shift);</P>
            <P>&nbsp;</P>
            <P>&nbsp;&nbsp;norm_shift1 = norm_l(st-&gt;ch_enrg[i]);</P>
            <P>&nbsp;&nbsp;Ltmp3 = L_shl1(st-&gt;ch_enrg[i], norm_shift1 - 
            1);</P>
            <P>&nbsp;&nbsp;Ltmp2 = L_divide(Ltmp3, Ltmp);</P>
            <P>&nbsp;&nbsp;Ltmp2 = L_shr(Ltmp2, 27 - 1 + norm_shift1 - 
            norm_shift);&nbsp;// * scaled as 27,4 *</P>
            <P>&nbsp;&nbsp;if (Ltmp2 == 0)</P>
            <P>&nbsp;&nbsp;&nbsp;Ltmp2 = 1;</P>
            <P>&nbsp;</P>
            <P>&nbsp;&nbsp;Ltmp1 = fnLog10(Ltmp2);</P>
            <P>&nbsp;&nbsp;Ltmp3 = L_add(Ltmp1, LOG_OFFSET - 80807124);&nbsp;// 
            * -round(log10(2^4)*2^26 *</P>
            <P>&nbsp;&nbsp;Ltmp2 = L_mult(TEN_S5_10, extract_h(Ltmp3));</P>
            <P>&nbsp;&nbsp;if (Ltmp2 &lt; 0)</P>
            <P>&nbsp;&nbsp;&nbsp;Ltmp2 = 0;</P>
            <P>&nbsp;&nbsp;// * 0.1875 scaled as 10,21 *</P>
            <P>&nbsp;&nbsp;Ltmp1 = L_add(Ltmp2, CONST_0_1875_S10_21);</P>
            <P>&nbsp;&nbsp;// * tmp / 0.375&nbsp; 2.667 scaled as 5,10, Ltmp is 
            scaled 15,16 *</P>
            <P>&nbsp;&nbsp;Ltmp = L_mult(extract_h(Ltmp1), 
            CONST_2_667_S5_10);</P>
            <P>&nbsp;&nbsp;ch_snr[i] = extract_h(Ltmp);</P>
            <P>&nbsp;}</P>
            <P>&nbsp;*/</P>
            <P>&nbsp;&nbsp;</P>
            <P>2、优化后程序:</P>
            <P>&nbsp;//因循环体太大,拆成两个循环并把相应的函数内嵌以使程序能pipeline,</P>
            <P>&nbsp;//用L_div_tmp[]保存因拆分而产生的中间变量。</P>
            <P>&nbsp;for (i = LO_CHAN; i &lt;= HI_CHAN; i++)</P>
            <P>&nbsp;{</P>
            <P>&nbsp;&nbsp;//norm_shift = norm_l(st-&gt;ch_noise[i]);</P>
            <P>&nbsp;&nbsp;norm_shift = _norm(st-&gt;ch_noise[i]);</P>
            <P>&nbsp;&nbsp;Ltmp = _sshl(st-&gt;ch_noise[i], norm_shift);</P>
            <P>&nbsp;</P>
            <P>&nbsp;&nbsp;//norm_shift1 = norm_l(st-&gt;ch_enrg[i]);&nbsp;</P>
            <P>&nbsp;&nbsp;norm_shift1 = 
            _norm(st-&gt;ch_enrg[i]);&nbsp;&nbsp;</P>
            <P>&nbsp;&nbsp;//Ltmp3 = L_shl1(st-&gt;ch_enrg[i], norm_shift1 - 
            1);</P>
            <P>&nbsp;&nbsp;LLtmp1 = st-&gt;ch_enrg[i];&nbsp;&nbsp;</P>
            <P>&nbsp;&nbsp;LLtmp1 = LLtmp1 &lt;&lt; (norm_shift1 + 7);</P>
            <P>&nbsp;&nbsp;Ltmp3 = (Word32)(LLtmp1 &gt;&gt; 8);</P>
            <P>&nbsp;</P>
            <P>&nbsp;&nbsp;Ltmp2 = IL_divide(Ltmp3, Ltmp);</P>
            <P>&nbsp;&nbsp;//Ltmp2 = L_shr(Ltmp2, 27 - 1 + norm_shift1 - 
            norm_shift);&nbsp; </P>
            <P>&nbsp;&nbsp;Ltmp2 = (Ltmp2 &gt;&gt; (27 - 1 + norm_shift1 - 
            norm_shift));</P>
            <P>&nbsp;</P>
            <P>&nbsp;&nbsp;if (Ltmp2 == 0)</P>
            <P>&nbsp;&nbsp;&nbsp;Ltmp2 = 1;</P>
            <P>&nbsp;&nbsp;L_div_tmp[i] = Ltmp2;</P>
            <P>&nbsp;}</P>
            <P>&nbsp;for (i = LO_CHAN; i &lt;= HI_CHAN; i++)</P>
            <P>&nbsp;{</P>
            <P>&nbsp;&nbsp;Ltmp2 = L_div_tmp[i];</P>
            <P>&nbsp;&nbsp;Ltmp1 = IfnLog10(Ltmp2);</P>
            <P>&nbsp;&nbsp;//Ltmp3 = L_add(Ltmp1, LOG_OFFSET - 
            80807124);&nbsp;</P>
            <P>&nbsp;&nbsp;Ltmp3 = _sadd(Ltmp1, LOG_OFFSET - 80807124);</P>
            <P>&nbsp;&nbsp;//Ltmp2 = L_mult(TEN_S5_10, extract_h(Ltmp3));</P>
            <P>&nbsp;&nbsp;Ltmp2 = _smpy(TEN_S5_10, (Ltmp3 &gt;&gt; 16));</P>
            <P>&nbsp;&nbsp;if (Ltmp2 &lt; 0)</P>
            <P>&nbsp;&nbsp;&nbsp;Ltmp2 = 0;</P>
            <P>&nbsp;&nbsp;</P>
            <P>&nbsp;&nbsp;Ltmp1 = _sadd(Ltmp2, CONST_0_1875_S10_21);</P>
            <P>&nbsp;&nbsp;</P>
            <P>&nbsp;&nbsp;//Ltmp = L_mult(extract_h(Ltmp1), 
            CONST_2_667_S5_10);</P>
            <P>&nbsp;&nbsp;Ltmp = _smpy((Ltmp1 &gt;&gt; 16), 
            CONST_2_667_S5_10);&nbsp;&nbsp;</P>
            <P>&nbsp;&nbsp;//ch_snr[i] = extract_h(Ltmp);</P>
            <P>&nbsp;&nbsp;ch_snr[i] = (Ltmp &gt;&gt; 16);</P>
            <P>&nbsp;}</P>
            <P>&nbsp;</P>
            <P>3、优化说明</P>
            <P>&nbsp;观察上面这个循环,循环体本身比较大,且含有两个函数L_divide()和</P>
            <P>&nbsp;fnLog10(),而C62内部只有32个寄存器,且有些寄存器是系统用的,如B14、B15这样循环体太大将会导致寄存器不够分配,从而导致系统编译器无法实现循环的pipeline。</P>
            <P>&nbsp;&nbsp;为了实现循环的pipeline。我们需要把循环体进行拆分,拆分时要考虑以下几点:</P>
            <P>&nbsp;(1)、拆分成几个循环比较合适?在各个循环能pipeline的前提下,拆开的循环个数越少越好。这就要求尽可能让各个循环的运算量接近。</P>
            <P>&nbsp;(2)考虑在什么地方把程序拆开比较合适?循环体里的数据流往往并不是单一的,在拆开的断点处势必要用中间变量保存上次的循环运算结果,供以后的循环用。适当的拆开循环体,使所需的中间变量越少越好。</P>
            <P>&nbsp;(3)循环体中的函数调用必须定义成内嵌形式,含有函数调用的循环系统是无法使之pipeline的;各个循环体中的判断分支机构不可太多,否则系统也无法使之pipeline,为此应近可能把可以确定下来的分支确定下来,并尽可能用内嵌指令。&nbsp;</P>
            <P>&nbsp;&nbsp;针对上面这个例子,考虑:</P>
            <P>&nbsp;(1)为让各个循环的运算量大致相当,应把L_divide()和fnLog10()分到两个循环中去,从循环体大小上考虑,估计拆成两个循环比较合适。</P>
            <P>&nbsp;(2)考虑在什么地方把程序拆开比较合适?在</P>
            <P>&nbsp;&nbsp;if (Ltmp2 == 0)</P>
            <P>&nbsp;&nbsp;&nbsp;Ltmp2 = 1;</P>
            <P>后拆开,因为后面用到的数据只有Ltmp2,故只需用一个数组保存每次循环的Ltmp2值即可。</P>
            <P>&nbsp;(3)循环体中的两处函数调用L_divide()和fnLog10()都定义了其内嵌形式,IL_divide()和IfnLog10()。当把可以确定下来的分支作确定处理,并尽可能用内嵌指令后,该循环体中所剩的分支结构已很少,循环体可以pipeline。优化前程序用2676 
            cycle,优化后用400 
      cycle。优化后两个子循环的MII分别为14和6cycle。</P><BR></TD></TR></TBODY></TABLE><BR>
      <TABLE class=hight1 cellSpacing=0 cellPadding=0 width="100%" 
      bgColor=#cccccc border=0>
        <TBODY>
        <TR>
          <TD>&nbsp;</TD></TR></TBODY></TABLE><BR>
      <TABLE 
      style="BORDER-RIGHT: #cccccc 1px solid; BORDER-TOP: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; BORDER-BOTTOM: #cccccc 1px solid" 
      height=29 cellSpacing=0 cellPadding=0 width="100%" border=0>
        <TBODY>
        <TR bgColor=#ffa45b>
          <TD class=hight2>&nbsp;</TD></TR>
        <TR bgColor=#ff7300>
          <TD class=font13 style="PADDING-LEFT: 10px" height=20><IMG 
            src="C6000软件优化经验总结(3).files/icon06.gif" align=absMiddle> <FONT 
            color=#ffffff><STRONG>相关文章</STRONG></FONT></TD></TR>
        <TR bgColor=#f29800>
          <TD class=hight2>&nbsp;</TD></TR>
        <TR>
          <TD style="PADDING-LEFT: 10px; LINE-HEIGHT: 24px">· <A class=link13 
            title="文章标题:TMS320VC5509的工作流程&#13;&#10;作    者:佚名&#13;&#10;更新时间:2006-2-22 15:30:34&#13;&#10;点击次数:90" 
            href="http://www.icembed.com/info.asp?ArticleID=1421">TMS320VC5509的工作流程</A>[<FONT 
            color=red>90</FONT>]<BR>· <A class=link13 
            title="文章标题:TI-MSP430F149在TCP/IP上的扩展&#13;&#10;作    者:佚名&#13;&#10;更新时间:2006-2-22 15:25:00&#13;&#10;点击次数:95" 
            href="http://www.icembed.com/info.asp?ArticleID=1419">TI-MSP430F149在TCP/IP上的扩展</A>[<FONT 
            color=red>95</FONT>]<BR>· <A class=link13 
            title="文章标题:AVR芯片的ISP全攻略&#13;&#10;作    者:佚名&#13;&#10;更新时间:2006-2-22 15:22:52&#13;&#10;点击次数:67" 
            href="http://www.icembed.com/info.asp?ArticleID=1418">AVR芯片的ISP全攻略</A>[<FONT 
            color=red>67</FONT>]<BR>· <A class=link13 
            title="文章标题:pci卡设计心得&#13;&#10;作    者:佚名&#13;&#10;更新时间:2006-2-22 15:18:04&#13;&#10;点击次数:81" 
            href="http://www.icembed.com/info.asp?ArticleID=1416">pci卡设计心得</A>[<FONT 
            color=red>81</FONT>]<BR>· <A class=link13 
            title="文章标题:C6000软件优化经验总结(2)&#13;&#10;作    者:佚名&#13;&#10;更新时间:2006-2-22 15:09:16&#13;&#10;点击次数:83" 
            href="http://www.icembed.com/info.asp?ArticleID=1412">C6000软件优化经验总结(2)</A>[<FONT 
            color=red>83</FONT>]<BR></TD></TR></TBODY></TABLE><BR>
      <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 bgColor=#ffa45b>
          <TD class=hight2>&nbsp;</TD></TR>
        <TR bgColor=#ff7300>
          <TD class=font13 style="PADDING-LEFT: 10px" height=20><IMG 
            src="C6000软件优化经验总结(3).files/icon06.gif" align=absMiddle> <FONT 
            color=#ffffff><STRONG>文章评论</STRONG></FONT></TD></TR>
        <TR bgColor=#f29800>
          <TD class=hight2>&nbsp;</TD></TR>
        <TR>
          <TD 
          style="PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; LINE-HEIGHT: 24px; PADDING-TOP: 10px">&nbsp;&nbsp;&nbsp;&nbsp;没有任何评论 
          </TD></TR></TBODY></TABLE><BR>(*只显示最新10条评论。评论内容只代表网友观点,与本站立场无关。) <BR><BR>
      <TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -