DSP应用优化技术――第二部分
<STRONG>简介</STRONG>
<P>       数字信号处理 (DSP) 是一种采用增强功能处理信号与数据,以及修改这些信号的方法。数字信号处理技术还可用于分析信号,以确定特定的信息内容。DSP 主要涉及真实信号的处理。这些信号根据序号进行转换与表示。然后采用数学方法处理这些信号,以便从信号提取特定信息或者以某种方式转换信号。 </P>
<P>       DSP 一般驻留在实时嵌入式系统,其中计算的及时性与其正确性同等重要。DSP 在这些环境中很普通,因为对它们经过精心设计后,可非常迅速地执行常见的信号处理运算。DSP 的可编程性使应用能够随时间而改变和演进,从而为应用供应商提供众多优势。对 DSP 编程需要了解应用、DSP 硬件架构、以及用于生成可满足系统紧迫期限要求的高效实时软件代码生成工具。 </P>
<P>       本文是系列文章的第二部分,总结在实践中从高性能 DSP 获得数量级速度提高所采用的某些技术。 </P>
<P>    <STRONG>   优化的首要原则----切勿盲动!</STRONG> </P>
<P>       在开始进行任何优化之前,您必须了解从何处着手。就性能方面来看,并非所有软件生来相同!您必须首先了解瓶颈在何处。一旦分析了应用,就可以开始调整代码。应用程序分析意味着权衡需在每部分代码所花费的时间(或者所占用的内存、所消耗的功率)。软件的某些部分可能只执行一次(初始化)或者只执行少数几次。如果费尽心思优化此部分代码并非明智之举,因为获得的整体节省效果会是微乎其微。更可能的情况是,会有几部分软件执行很多次,尽管代码自身可能会很短,但代码执行频繁意味着花费在该代码的总循环会很多。即使如果您在这些代码中可以节省一、两个循环,所获得的节省也会很可观。这就是在调整和优化过程中您应该多费些时间的地方。 </P>
<P>       <STRONG>并行是关键所在 </STRONG></P>
<P>       在编程超量标及 VLIM 期间时所要遵循的标准原则是"保持流水线充满"(Keep the pipelines full!)。充满的流水线意味着有效的代码。为了确定流水线充满的程度,您需要费些时间检查汇编程序生成的汇编语言代码。通常可以根据代码中NOP 的冗余性检查低效的代码。 </P>
<P>       为了证明在基于 VLIW 的超量标机器中并行性的优势,让我们首先从图 1 所示的简单循环程序入手。如果我们准备编写此程序的串行汇编语言实施,其代码会与图 2 中的类似。此循环采用超量标机器的两个可用侧之一。通过指令与 NOP 计数,它需要 26 个循环来执行循环的每个迭代。但是,我们可以做得更好。 </P>
<P>       在这个例子中,需要注意两件事情。许多执行单元并未使用,而是处于空闲状态。这是对处理器硬件的浪费。其次,在汇编程序的此部分存在众多延迟间隙(准确说是 20 个),在其中 CPU 需要停滞下来等待加载或保存数据。在 CPU 停滞时,不会进行任何操作。在试图处理大量数据时,这对处理器是很糟糕的事情。 </P>
<P>       有众多方法可以在等待数据期间保持 CPU 运转。我们可以执行不依赖正在等待的数据的其他运算。我们还可以使用超量标结构的两侧来帮助加载和保存其他数据值。图 3 中的代码就是一种对串行版本的改进。我们已经将 NOP 的数量从 20 个降至了 5 个。我们还可以并行执行某些步骤。第 4 行和第 5 行同时执行向器件的两个单元(D1 和 D2)的加载。此代码还执行循环前的分支运算,然后充分利用与该运算相关的延迟来完成当前循环的运算。请注意,在该代码中存在新的一列,它可指定您希望将哪次执行单元用于特定运算。这种指定执行单元的灵活性使您能够更好地对运算进行控制。 </P>
<P>1 void example1(float *out, float *input1, float *input2)<BR>2 {<BR>3   int i;<BR>4<BR>5   for(i = 0; i < 100; i++) <BR>6    {<BR>7       out[i] = input1[i] * input2[i];<BR>8    }<BR>9 }</P>
<P>图1:简单的C循环 <BR><BR>1 <BR>2     serial implementation of loop (26 cycles per iteration)<BR>3 <BR>4 L1:  LDW  *B++,B5 load B[i] into B5<BR>5   NOP  4  wait for load to complete<BR>6 <BR>7   LDW  *A++,A4 load A[i] into A4<BR>8   NOP  4  wait for load to complete<BR>9  <BR>10   MPYSP       B5,A4,A4 A4 = A4 * B5<BR>11   NOP  3  wait for mult to complete<BR>12  <BR>13   STW  A4,*C++ store A4 in C[i]</P>
相关资讯