来源:作者: 发布时间:2007-01-22 00:00:00


这是我现在看到的写得最全的一篇,贴出来和大家分享。
考虑一个数字信号处理的实例,比如有限冲击响应滤波器(FIR)。用数学语言来说,FI R滤波器是做一系列的点积。取一个输入量和一个序数向量,在系数和输入样本的滑动窗 口间作乘法,然后将任何的乘积加起来,形成一个输出样本。
类似的运算在数字信号处理过程中大量地重复发生,使得为此设计的器件必须提供专门 的支持,促成了了DSP器件和通用处理器(GPP)的分流:
1 对密集的乘法运算的支持
GPP不是设计来做密集乘法任务的,即使是一些现代的GPP,也需要多个指令周期来做一 次乘法。而DSP处理器使用专门的硬件来实现单周期乘法。DSP处理器还增加了累加器寄 存器来处理多个乘积的和。累加器寄存器通常比其他寄存器宽,增加称为结果bits的额 外bits来避免溢出。 同时,为了充分体现专门的乘法-累加硬件的好处,几乎任何的DSP的指令集都包含有显 式的MAC指令。
2 存储器结构
传统上,GPP使用冯.诺依曼存储器结构。这种结构中,只有一个存储器空间通过一组总 线(一个地址总线和一个数据总线)连接到处理器核。通常,做一次乘法会发生4次存储 器访问,用掉至少四个指令周期。
大多数DSP采用了哈佛结构,将存储器空间划分成两个,分别存储程式和数据。他们有两 组总线连接到处理器核,允许同时对他们进行访问。这种安排将处理器存贮器的带宽加 倍,更重要的是同时为处理器核提供数据和指令。在这种布局下,DSP得以实现单周期的 MAC指令。
更有一个问题,即现在典型的高性能GPP实际上已包含两个片内高速缓存,一个是数据, 一个是指令,他们直接连接到处理器核,以加快运行时的访问速度。从物理上说,这种 片内的双存储器和总线的结构几乎和哈佛结构的相同了。然而从逻辑上说,两者还是有 重要的区分。
GPP使用控制逻辑来决定哪些数据和指令字存储在片内的高速缓存里,其程式员并不加以 指定(也可能根本不知道)。和此相反,DSP使用多个片内存储器和多组总线来确保每个 指令周期内存储器的多次访问。在使用DSP时,程式员要明确地控制哪些数据和指令要存 储在片内存储器中。程式员在写程式时,必须确保处理器能够有效地使用其双总线。
此外,DSP处理器几乎都不具备数据高速缓存。这是因为DSP的典型数据是数据流。也就 是说,DSP处理器对每个数据样本做计算后,就丢弃了,几乎不再重复使用。
3 零开销循环
假如了解到DSP算法的一个一起的特点,即大多数的处理时间是花在执行较小的循环上, 也就容易理解,为什么大多数的DSP都有专门的硬件,用于零开销循环。所谓零开销循环 是指处理器在执行循环时,不用花时间去检查循环计数器的值、条件转移到循环的顶部 、将循环计数器减1。
和此相反,GPP的循环使用软件来实现。某些高性能的GPP使用转移预告硬件,几乎达到 和硬件支持的零开销循环同样的效果。
4 定点计算
大多数DSP使用定点计算,而不是使用浮点。虽然DSP的应用必须十分注意数字的精确, 用浮点来做应该容易的多,但是对DSP来说,廉价也是很重要的。定点机器比起相应的 浮点机器来要便宜(而且更快)。为了不使用浮点机器而又确保数字的准确,DSP处理器 在指令集和硬件方面都支持饱和计算、舍入和移位。
5 专门的寻址方式
DSP处理器往往都支持专门的寻址模式,他们对通常的信号处理操作和算法是很有用的。 例如,模块(循环)寻址(对实现数字滤波器延时线很有用)、位倒序寻址(对FFT很有 用)。这些很专门的寻址模式在GPP中是不常使用的,只有用软件来实现。
6 执行时间的预测
大多数的DSP应用(如蜂窝电话和调制解调器)都是严格的实时应用,任何的处理必须在 指定的时间内完成。这就需要程式员准确地确定每个样本需要多少处理时间,或,至 少要知道,在最坏的情况下,需要多少时间。
假如打算用低成本的GPP去完成实时信号处理的任务,执行时间的预测大概不会成为什么 问题,应为低成本GPP具备相对直接的结构,比较容易预测执行时间。然而,大多数实时 DSP应用所需要的处理能力是低成本GPP所不能提供的。
这时候,DSP对高性能GPP的优势在于,即便是使用了高速缓存的DSP,哪些指令会放进去 也是由程式员(而不是处理器)来决定的,因此很容易判断指令是从高速缓存还是从存 储器中读取。DSP一般不使用动态特性,如转移预测和推理执行等。因此,由一段给定的 代码来预测所需要的执行时间是完全直截了当的。从而使程式员得以确定芯片的性能限 制。
7 定点DSP指令集
定点DSP指令集是按两个目标来设计的:
使处理器能够在每个指令周期内完成多个操作,从而提高每个指令周期的计算效率。 将存贮DSP程式的存储器空间减到最小(由于存储器对整个系统的成本影响甚大,该问题 在对成本敏感的DSP应用中尤为重要)。 为了实现这些目标,DSP处理器的指令集通常都允许程式员在一个指令内说明若干个并行 的操作。例如,在一条指令包含了MAC操作,即同时的一个或两个数据移动。在典型的例 子里,一条指令就包含了计算FIR滤波器的一节所需要的任何操作。这种高效率付出的代 价是,其指令集既不直观,也不容易使用(和GPP的指令集相比)。
GPP的程式通常并不在意处理器的指令集是否容易使用,因为他们一般使用象C或C++等高 级语言。而对于DSP的程式员来说,不幸的是主要的DSP应用程式都是用汇编语言写的( 至少部分是汇编语言优化的)。这里有两个理由:首先,大多数广泛使用的高级语言, 例如C,并不适合于描述典型的DSP算法。其次,DSP结构的复杂性,如多存储器空间、多 总线、不规则的指令集、高度专门化的硬件等,使得难于为其编写高效率的编译器。
即便用编译器将C源代码编译成为DSP的汇编代码,优化的任务仍然很重。典型的DSP应用 都具备大量计算的需要,并有严格的开销限制,使得程式的优化必不可少(至少是对程 序的最关键部分)。因此,考虑选用DSP的一个关键因素是,是否存在足够的能够较好地 适应DSP处理器指令集的程式员。
8 研发工具的需要
因为DSP应用需要高度优化的代码,大多数DSP厂商都提供一些研发工具,以帮助程式员 完成其优化工作。例如,大多数厂商都提供处理器的仿真工具,以准确地仿真每个指令 周期内处理器的活动。无论对于确保实时操作还是代码的优化,这些都是很有用的工具 。
GPP厂商通常并不提供这样的工具,主要是因为GPP程式员通常并无需周详到这一层的 信息。GPP缺乏精确到指令周期的仿真工具,是DSP应用研发者所面临的的大问题:由于 几乎不可能预测高性能GPP对于给定任务所需要的周期数,从而无法说明怎样去改善代码 的性能。
|
还没有关于此文章的相关评论!