- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
DSP应用优化技术――第二部分.doc
DSP应用优化技术――第二部分
数字信号处理 (DSP) 是一种采用增强功能处理信号与数据,以及修改这些信号的方法。数字信号处理技术还可用于分析信号,以确定特定的信息内容。DSP 主要涉及真实信号的处理。这些信号根据序号进行转换与表示。然后采用数学方法处理这些信号,以便从信号提取特定信息或者以某种方式转换信号。
DSP 一般驻留在实时嵌入式系统,其中计算的及时性与其正确性同等重要。DSP 在这些环境中很普通,因为对它们经过精心设计后,可非常迅速地执行常见的信号处理运算。DSP 的可编程性使应用能够随时间而改变和演进,从而为应用供应商提供众多优势。对 DSP 编程需要了解应用、DSP 硬件架构、以及用于生成可满足系统紧迫期限要求的高效实时软件代码生成工具。
本文是系列文章的第二部分,总结在实践中从高性能 DSP 获得数量级速度提高所采用的某些技术。
优化的首要原则----切勿盲动!
在开始进行任何优化之前,您必须了解从何处着手。就性能方面来看,并非所有软件生来相同!您必须首先了解瓶颈在何处。一旦分析了应用,就可以开始调整代码。应用程序分析意味着权衡需在每部分代码所花费的时间(或者所占用的内存、所消耗的功率)。软件的某些部分可能只执行一次(初始化)或者只执行少数几次。如果费尽心思优化此部分代码并非明智之举,因为获得的整体节省效果会是微乎其微。更可能的情况是,会有几部分软件执行很多次,尽管代码自身可能会很短,但代码执行频繁意味着花费在该代码的总循环会很多。即使如果您在这些代码中可以节省一、两个循环,所获得的节省也会很可观。这就是在调整和优化过程中您应该多费些时间的地方。?
并行是关键所在
在编程超量标及 VLIM 期间时所要遵循的标准原则是保持流水线充满(Keep the pipelines full!)。充满的流水线意味着有效的代码。为了确定流水线充满的程度,您需要费些时间检查汇编程序生成的汇编语言代码。通常可以根据代码中NOP 的冗余性检查低效的代码。
为了证明在基于 VLIW 的超量标机器中并行性的优势,让我们首先从图 1 所示的简单循环程序入手。如果我们准备编写此程序的串行汇编语言实施,其代码会与图 2 中的类似。此循环采用超量标机器的两个可用侧之一。通过指令与 NOP 计数,它需要 26 个循环来执行循环的每个迭代。但是,我们可以做得更好。
在这个例子中,需要注意两件事情。许多执行单元并未使用,而是处于空闲状态。这是对处理器硬件的浪费。其次,在汇编程序的此部分存在众多延迟间隙(准确说是 20 个),在其中 CPU 需要停滞下来等待加载或保存数据。在 CPU 停滞时,不会进行任何操作。在试图处理大量数据时,这对处理器是很糟糕的事情。
有众多方法可以在等待数据期间保持 CPU 运转。我们可以执行不依赖正在等待的数据的其他运算。我们还可以使用超量标结构的两侧来帮助加载和保存其他数据值。图 3 中的代码就是一种对串行版本的改进。我们已经将 NOP 的数量从 20 个降至了 5 个。我们还可以并行执行某些步骤。第 4 行和第 5 行同时执行向器件的两个单元(D1 和 D2)的加载。此代码还执行循环前的分支运算,然后充分利用与该运算相关的延迟来完成当前循环的运算。请注意,在该代码中存在新的一列,它可指定您希望将哪次执行单元用于特定运算。这种指定执行单元的灵活性使您能够更好地对运算进行控制。
1 void example1(float *out, float *input1, float *input2)2 {3?? int i;45?? for(i = 0; i 100; i++) 6??? {7?????? out[i] = input1[i] * input2[i];8??? }9 }
图1:简单的C循环
1 ;2 ;??? serial implementation of loop (26 cycles per iteration)3 ;4 L1:? LDW? *B++,B5 ;load B[i] into B55?? NOP? 4? ; wait for load to complete6 7?? LDW? *A++,A4 ; load A[i] into A48?? NOP? 4? ; wait for load to complete9? 10?? MPYSP?????? B5,A4,A4 ; A4 = A4 * B511?? NOP? 3? ; wait for mult to complete12? 13?? STW? A4,*C++ ; store A4 in C[i]14?? NOP? 4? ; wait got stor
文档评论(0)