首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

在DSP处理器上并行实现ATR算法(2)

在DSP处理器上并行实现ATR算法(2)

本帖最后由 yuyang911220 于 2016-12-29 15:27 编辑

3 在指令级并行DSP处理器上实现ATR算法
  在单片DSP处理器内通过多个功能单元的指令级并行(ILP)实现ATR算法的并行化处理,目前适合ATR算法实时处理的指令级并行芯片是TI公司的TMS320C6x系列DSP。TMS320C6x系列DSP处理器是第一个使用超长指令字(VLIW)体系结构的数字信号处理芯片。下面以TMS320C62x定点系列DSP为例说明指令级并行的原理和ATR并行算法软件开发方法。 3.1 VLIW体系结构 TMS320C62x的内核结构如图1所示。内核中的8个功能单元可以完全并行运行,功能单元执行逻辑、位移、乘法、加法和数据寻址等操作。内核采用VLIW体系结构,单指令字长32位,取指令、指令分配和指令译码单元每周期可以从程序存储器传递8条指令到功能单元。这8条指令组成一个指令包,总字长为256位。芯片内部设置了专门的指令分配模块,可以将每个256位的指令分配到8个功能单元中,并由8个功能单元并行运行。TMS320C62x芯片的最高时钟频率可以达到200MHz。当8个功能单元同时运行时,该芯片的处理能力高达1600MIPS。
  3.2 基于TMS320C62x的并行算法软件开发方法
  基于TMS320C62x的并行编译系统支持C语言和汇编语言开发并行程序代码。通常,开发ATR并行算法按照代码开发流程的三个阶段进行并行程序设计:第一阶段是开发C代码;第二阶段是优化C代码;第三阶段是编写线性汇编代码。以上三个阶段不是必须的,如果在某一阶段已经实现了ATR算法的功能和性能要求,就不必进入下一阶段。
  (1)开发C代码
  开发C代码需要考虑的要点包括: ①数据结构 TMS320C62x编译器定义了各种数据结构的长度:字符型(char)为8位,短整型(short)为16位,整型(int)为32位,长整形(long)为40位,浮点型(float)为32位,双精度浮点型(double)为64位。在编写C代码时应当遵循的规则是:避免在代码中将int和long型作为同样长度处理;对于定点乘法,应当尽可能使用short型数据;对循环计数器使用int或者无符号int类型,避免不必要的符号扩展。 ②提高C代码性能 应用调试器的Profile工具可以得到一个关于C代码中各特定代码段执行情况的统计表,也可以得到特定代码段招待所用的CPU时钟周期数。因此可以找出影响软件程序总体性能的C代码段加以改进,通常是循环代码段影响软件程序总体性能。 ③数据的定标 由于TMS320C62x是定点系列芯片,不支持浮点操作。在程序编写过程中,应当尽量采用定点的数据结构。而实际处理的数据通常都是浮点的,所以需要把浮点数据通过定标转化为整型数据处理,提高程序的处理速度。数据的定标是十分关键的步骤,既要使数据处理精度满足性能要求,又要防止在数据处理过程中出现溢出。
  (2)优化C代码
  优化C代码包括向编译器指明不相关的指令、循环展开、循环合并、使用内联函数、使用字访问短整型数据和软件流水等方法。 ①向编译器指明不相关的指令 为使指令并行操作,编译器必须确定指令间的相关性,只有不相关的指令才可以并行执行。如果编译器不能确定两条指令是不相关的,则认为是相关的,安排它们串行招待。用户可通过如下方法指明相关的指令: %26;#183;关键字const可以指定一个目标,const表示一个变量或者一个变量的存储单元保持不变,使用const可以提高代码的性能和适应性。 一起使用-pm选项和-03选项可以确定程序优先级。在程序优先级中,所有源文件都被编译成一个模块,从而使编译器更有效地消除相关性。 %26;#183;使用-mt选项向编译器说明在代码中不存在存储器相关性,即允许编译器在无存储器相关性的假设下进行优化。 ②循环展开 循环展开就是把循环计数小的循环展开,成为非循环形式的串行程序,或者把循环计数大的循环部分展开,减少循环迭代次数,增加单个循环内的代码,使得循环内的操作可以均匀分布在各个功能单元上,保持DSP处理器的各个功能单元满负荷运行。 ③循环合并 如果两个循环计数差不多、循环执行互不相同的操作,可以把它们合并在一起组成一个循不。当两个循环的负荷都不满时,这是非常有用的。 ④使用内联函数 TMS320C62x编译器提供的内联函数是直接映射为内联指令的特殊函数,内联函数的代码高效、代码长度短。用户可以使用内联函数并行优化C代码。 ⑤使用字节访问短整型数据 内联函数中有些指令是对存储在32位寄存器的高16位和低16位字段进行操作的。当有大量短整型数据进行操作时,可以使用字(整型数)一次访问两个短整型数据。然后使用内联函数对这些数据进行操作,从而减少对内存的访问。 ⑥软件流水 软件流水是用来安排循环指令,使这个循环多次迭代并行执行的一种技术。在编译时使用-o2和-o3选项,编译器可对循环代码实现软件流水;使用-o3和-pm选项,使优化器访问整个程序,了解循环次数;使用_nassert内联函数,防止冗余循环产生;使用投机执行(_mh选项)消除软件注流水循环的排空,从而减少代码尺寸。 在嵌套循环中,编译器仅对最里面的循环执行软件流水,因此对招待周期很少的内循环作循环展开,外循环进行软件流水,这样可以改进C代码并行执行的性能。使用软件流水还应当注意:尽管软件流水循环可以包含内联函数,但是不能包含函数调用;在循环中不可以有条件终止指令;在循环体中不可以修改循环控制变量。
  (3)编写线性汇编代码
  编写线性汇编代码是并行算法软件开发流程的第三个阶段。了提高并行算法软件代码的性能,对影响并行程序速度的关键C代码可以用线性编重新编写。编写线性汇编代码不需要指明使用的寄存器、指令的并行与否、指令的延迟周期和指令使用的功能单元,汇编优化器会根据情况确定这些住处。优化线性汇编代码的方法包括:为线性汇编指令指定功能单元,使得最后的汇编指令并行执行;使用字访问短整型数据;使用软件流水对循环进行优化。编写线性汇编代码的工作量非常大,需要很长的开发周期,而且开发后的汇编代码不能像C代码那样移植在其它的DSP平台上。
  应用上述并行程序开发方法,在TMS320C6201 EVM板上实现了宽带毫米波雷达目标时延神经网络识别算法。经过实际测试,并行算法程序执行时间为0.850ms,满足了目标识别算法的实时性需求。
继承事业,薪火相传
返回列表