论文部分内容阅读
最近随着高性能嵌入式媒体处理器走向实用,原来以个人计算机(PC)为中心的设计在许多应用领域都将让位于嵌入式解决方案。这就意味着软件工程师需要将基于媒体的算法从存储器资源“无限的”原型系统(例如PC或工作站)移植到嵌入式系统中,嵌入式系统必须进行资源管理才能满足最低的性能要求。这些工程师力争在特定的应用中获得最高的性能,而且不增加他们习惯的编程模型的复杂度。考虑到这种情况,他们需要的就是一套编程“框架”,帮助他们克服多媒体处理的主要难题——例如,组织输入和输出缓冲数据流,智能地划分存储器,以及采用信号量来控制数据传送。
数据传送的物理过程
了解系统中数据传送的“物理过程”是所有项目开始的必需步骤。除了确定希望得到的吞吐量对于一个应用是否刚好能行,实践可以产生很大的性能储备,而且无需很大量的初期投资。
大多数媒体处理器都采用分级的存储器体系结构,力图在几级具有不同尺寸和性能水准的存储器之间达到平衡。一般地,最靠近内核处理器的存储器(称为一级或L1存储器)以全时钟速率工作,支持单周期内的指令执行。L1存储器通常被划分为指令段和数据段,目的是有效地利用存储器的总线带宽。这种存储器通常配置为静态随机存储器(SRAM)或高速缓存。需要最快决定的应用可以在单个内核时钟周期内访问芯片内的SRAM。对于需要较大代码尺寸的系统,通常要用到附加的片内L2存储器,其访问延时要高于L1,但还是比外部存储器读取要快得多.
对于多媒体应用,片内存储器往往不够用于存储完整的视频帧,尽管这样做对于高效处理来说是很理想的。因此,系统通常都必须依赖芯片外(“L3”)的动态随即存储器(DRAM)来支持较快地访问大的缓冲器。连接片外存储器的处理器接口构成了设计有效的媒体框架的一个主要因素,因为对外部存储器的访问模式必需充分地考虑以便保证最理想的数据吞吐量。有几种高水平的措施来保证数据能在任何系统的存储器中平稳地流动。下面将讨论其中的一些,而且它们在后面讨论的框架中起到了关键的作用。
在L1或L2中分段存储L3缓存数据
在片内存储器中缓存L3数据有几个重要的作用。首先,处理器内核访问片内缓冲器的延时要比访问片外缓冲器低得多。这样就直接地提高了系统性能。此外,在片内存储器中缓存L3数据允许更高效的外围DMA(“直接存储器存取”) 访问这些数据。例如,快速地将一帧视频从视频端口传送到L3存储器中会造成这样一种情况,其它的外围设备可能被锁定而无法访问它们需要的数据,因为视频传送是一个高优先权的进程。但是,通过将行增量从视频端口传送到L1或L2存储器中,可以发起一次存储器DMA流,这样就会把视频传送当成一个低优先权的进程悄悄地将这些数据传送到L3,从而使系统外围设备可以访问它们需要的数据。
分组传送以便减少存储器总线转向
当对外部存储器的访问在同一方向时(例如连续读或连续写),执行的效率是最高的。例如,在访问片外的同步存储器时,16次写操作接着16次读操作完成得往往比16次间插读写要快。这是因为写之后接着读的话会产生延时。如果随机访问外部存储器,“转向”发生的概率是很高的。这种附加延时很可能使可用带宽减半。因此,选择一种可以对特定方向的传送数量进行控制的处理器是很重要的。通常,在系统活动缓和时期采用最大的同向连续传送数量是最佳的。但是,对于负荷最重的系统数据流,选择一个中间值通常是最好,要保证不会有任何外围设备被锁定而无法访问外部存储器。
采用DMA和(或)高速缓存往往有助于在这个方面提高性能,因为在这类事务期间数据块是同向传送的。例如,一次DMA传送通常包括一块很大的数据缓冲区,将其从一个位置移动到另一个位置。类似地,一次高速缓存线的填充就是将一组连续存储器位置的数据移进或者移出设备。
保证SDRAM的行打开并完成数据的多次传递
每次访问外部SDRAM都可能占用好几个时钟周期,尤其是当所需的SDRAM行尚未激活时。行一旦被激活后,就有可能从一整行中读取数据,而不用每次访问时都重新打开该行。换句话说,在每个时钟周期访问存储器中的任何位置都是可能的,只要这些位置处于SDRAM的相同行中。
应用应该利用SDRAM组的优势,当它们因为适当地放置了数据缓存并在任何可能的时候管理访问而打开的时候。理想情况下,处理器应该允许一次打开SDRAM的多行,以便缩短随后对打开的存储器组中相同行的访问所需的建立时间(因此提高了吞吐率)。例如,在只打开一行的系统中,行激活延时会大大降低总性能。而另一方面,如果一次打开4行,行激活延时可以分摊给数百次访问。
关闭一行需要多个SDRAM时钟周期,因此频繁的行关闭会严重限制SDRAM的吞吐量。缓解这个问题的一种方法就是选择一种具有很高的最大时钟速率的SDRAM器件,并使处理器的外部总线时钟运行在频率。
优化时钟设置并保证刷新速率适合SDRAM运行的速率
SDRAM需要周期性的刷新以保证存储器中的数据保持其本征值。内核处理器或DMA引擎的访问在一个内部刷新周期结束之前是被禁止的。如果刷新得太频繁,对SDRAM的实际访问次数就会减少,SDRAM吞吐量也会降低。
构建一种框架的策略
在脑中有了上述概念,下面我们来分析3类多媒体框架。虽然它们只代表了所有可能的策略中的一小部分,但是它们提供了最常见的源管理情况的优良实例。为了说明问题,我们将采用以视频为中心的系统来说明这几种情况,因为它们包括在内部和外部存储器之间传送大量的数据,以及将原始数据转移进系统并将处理过的数据移出系统:
1.不能容忍延时的安全系统;
2.性能优先于编程难度的处理量大型应用;
3.编程难度优先于性能的系统。(换句话说,程序员有规定的期限!)
最低延时
这种情况力争在输入数据和输出结果之间取得绝对最低的延时。例如,假设一个基于照相机的汽车防撞系统,力图通过快速估计视野内连续视频帧以便将碰撞发生的可能减至最低。因为视频帧需要极大的存储容量(仅仅一帧NTSC电视图像就需要差不多700 KB的存储器),它们通常都需要外部存储器来存储,因为处理器很少会有足够的片内存储器来存哪怕是一帧的数据。但是如果防撞系统必须等到一帧完整的路面图像进入存储器之后才开始处理输入数据的话,就会损失33 ms的宝贵时间(假设帧率为30 Hz)。
为了保证最低的延时,视频数据可以送入片内的L1或L2存储器然后按照逐行的原则进行处理,从而实现快速计算,更快地得到结果。如果算法一次只能处理很少的几行,帧缓存器需求就很容易满足。NTSC视频的几行数据很容易进入L2存储器,因为L2存储器比片外的DRAM更接近内核处理器,这也可以显著地提高性能。
在这种框架中,处理器内核可以直接访问L2存储器中的视频数据。采用这种方式,编程模型与一般的基于PC的模型是相符的。为了保证数据的完整性,软件必须确保在当前帧处理完毕之前活动视频帧缓存器不会被新的数据覆盖。通过一种信号量机制,这是很容易控制的。在防撞系统中,每帧的处理结果都是一个判定——是否将有碰撞发生?因此,在这种情况下,就没有需要防止被覆盖的输出视频缓冲器。
性能优先于编程模型
这种情况通常注重算法,限制了目标处理器。一般地,开发工程师会设法让处理器“正好符合”其预期应用,所以他们不会把成本花在能力过剩的器件上。因此,这种“高效带宽”框架集中在取得最高的性能,其代价就是可能增加编程复杂度。对于这种情况,系统实现可能会花较长的时间,集成的难度要高一些,但是以低成本器件来设计带来的长期成本节省可能将证明额外的开发时间是合理的。在开发周期中的早期投入更多时间的原因就是数据流程的每一个方面都需要仔细地规划。当最终的数据流程构建好以后,就很难再重用了,因为要通过手工完成框架来满足特定的解决方案。
这里和前面的例子一样,视频数据行也可以送入L2存储器,内核可以根据需要直接访问它们用于预处理,延时比访问片外存储器要低。虽然这是一个很重要的侧面优势,但是这里采用L2存储器的目的是缓存几行的数据以便在相同方向进行成组的传送,以此提高外部存储器的总线性能。
编程难度优先于性能
第三种框架完全集中于获得最简单的编程模型,而可能付出一些性能代价。在这种情况下,面市时间通常是最重要的因素。它可能会造成器件超过规定的技术指标,这样一定会因为没有优化的编码造成大量空间的低效率。实际上,这种策略也提供了一种可升级的平台,因为一旦有可能集中优化应用代码时,处理器的带宽最终可以被释放出来。
任何一次处理多行数据并且不涉及压缩和解压缩的视频算法,都很适合采用这种框架。考虑一幅5×5的图像卷积核,用作一个边缘检测滤波器对输入视频行进行处理。对于优化的运算,内部存储器中的视频行数应该取最大值。典型的内核导航就是“回旋”,或者是从图像的左边移到右边,然后又从左边开始(在一页中读取码字时采用同样的过程)。这种回旋路线一直持续到内核到达整帧图像的最末。
从表面上看,这种卷积算法可以是一个经其它平台验证过的代码库中的一部分,而且最好不要改动它。因此,控制回旋需要对数据缓冲器进行操作来隐藏算法效果。因此,边界的数据可能会被丢弃,但是总的编程模型仍然完整无缺的。
尽管我们只讨论了很少的几种最常见的媒体处理框架,它们已经足以说明在多媒体环境中越来越普遍的数据和处理流程的类型。这里给出的模型可以用于具有更复杂的流程的系统中,因此可以缩短开发时间并加快面市时间。
数据传送的物理过程
了解系统中数据传送的“物理过程”是所有项目开始的必需步骤。除了确定希望得到的吞吐量对于一个应用是否刚好能行,实践可以产生很大的性能储备,而且无需很大量的初期投资。
大多数媒体处理器都采用分级的存储器体系结构,力图在几级具有不同尺寸和性能水准的存储器之间达到平衡。一般地,最靠近内核处理器的存储器(称为一级或L1存储器)以全时钟速率工作,支持单周期内的指令执行。L1存储器通常被划分为指令段和数据段,目的是有效地利用存储器的总线带宽。这种存储器通常配置为静态随机存储器(SRAM)或高速缓存。需要最快决定的应用可以在单个内核时钟周期内访问芯片内的SRAM。对于需要较大代码尺寸的系统,通常要用到附加的片内L2存储器,其访问延时要高于L1,但还是比外部存储器读取要快得多.
对于多媒体应用,片内存储器往往不够用于存储完整的视频帧,尽管这样做对于高效处理来说是很理想的。因此,系统通常都必须依赖芯片外(“L3”)的动态随即存储器(DRAM)来支持较快地访问大的缓冲器。连接片外存储器的处理器接口构成了设计有效的媒体框架的一个主要因素,因为对外部存储器的访问模式必需充分地考虑以便保证最理想的数据吞吐量。有几种高水平的措施来保证数据能在任何系统的存储器中平稳地流动。下面将讨论其中的一些,而且它们在后面讨论的框架中起到了关键的作用。
在L1或L2中分段存储L3缓存数据
在片内存储器中缓存L3数据有几个重要的作用。首先,处理器内核访问片内缓冲器的延时要比访问片外缓冲器低得多。这样就直接地提高了系统性能。此外,在片内存储器中缓存L3数据允许更高效的外围DMA(“直接存储器存取”) 访问这些数据。例如,快速地将一帧视频从视频端口传送到L3存储器中会造成这样一种情况,其它的外围设备可能被锁定而无法访问它们需要的数据,因为视频传送是一个高优先权的进程。但是,通过将行增量从视频端口传送到L1或L2存储器中,可以发起一次存储器DMA流,这样就会把视频传送当成一个低优先权的进程悄悄地将这些数据传送到L3,从而使系统外围设备可以访问它们需要的数据。
分组传送以便减少存储器总线转向
当对外部存储器的访问在同一方向时(例如连续读或连续写),执行的效率是最高的。例如,在访问片外的同步存储器时,16次写操作接着16次读操作完成得往往比16次间插读写要快。这是因为写之后接着读的话会产生延时。如果随机访问外部存储器,“转向”发生的概率是很高的。这种附加延时很可能使可用带宽减半。因此,选择一种可以对特定方向的传送数量进行控制的处理器是很重要的。通常,在系统活动缓和时期采用最大的同向连续传送数量是最佳的。但是,对于负荷最重的系统数据流,选择一个中间值通常是最好,要保证不会有任何外围设备被锁定而无法访问外部存储器。
采用DMA和(或)高速缓存往往有助于在这个方面提高性能,因为在这类事务期间数据块是同向传送的。例如,一次DMA传送通常包括一块很大的数据缓冲区,将其从一个位置移动到另一个位置。类似地,一次高速缓存线的填充就是将一组连续存储器位置的数据移进或者移出设备。
保证SDRAM的行打开并完成数据的多次传递
每次访问外部SDRAM都可能占用好几个时钟周期,尤其是当所需的SDRAM行尚未激活时。行一旦被激活后,就有可能从一整行中读取数据,而不用每次访问时都重新打开该行。换句话说,在每个时钟周期访问存储器中的任何位置都是可能的,只要这些位置处于SDRAM的相同行中。
应用应该利用SDRAM组的优势,当它们因为适当地放置了数据缓存并在任何可能的时候管理访问而打开的时候。理想情况下,处理器应该允许一次打开SDRAM的多行,以便缩短随后对打开的存储器组中相同行的访问所需的建立时间(因此提高了吞吐率)。例如,在只打开一行的系统中,行激活延时会大大降低总性能。而另一方面,如果一次打开4行,行激活延时可以分摊给数百次访问。
关闭一行需要多个SDRAM时钟周期,因此频繁的行关闭会严重限制SDRAM的吞吐量。缓解这个问题的一种方法就是选择一种具有很高的最大时钟速率的SDRAM器件,并使处理器的外部总线时钟运行在频率。
优化时钟设置并保证刷新速率适合SDRAM运行的速率
SDRAM需要周期性的刷新以保证存储器中的数据保持其本征值。内核处理器或DMA引擎的访问在一个内部刷新周期结束之前是被禁止的。如果刷新得太频繁,对SDRAM的实际访问次数就会减少,SDRAM吞吐量也会降低。
构建一种框架的策略
在脑中有了上述概念,下面我们来分析3类多媒体框架。虽然它们只代表了所有可能的策略中的一小部分,但是它们提供了最常见的源管理情况的优良实例。为了说明问题,我们将采用以视频为中心的系统来说明这几种情况,因为它们包括在内部和外部存储器之间传送大量的数据,以及将原始数据转移进系统并将处理过的数据移出系统:
1.不能容忍延时的安全系统;
2.性能优先于编程难度的处理量大型应用;
3.编程难度优先于性能的系统。(换句话说,程序员有规定的期限!)
最低延时
这种情况力争在输入数据和输出结果之间取得绝对最低的延时。例如,假设一个基于照相机的汽车防撞系统,力图通过快速估计视野内连续视频帧以便将碰撞发生的可能减至最低。因为视频帧需要极大的存储容量(仅仅一帧NTSC电视图像就需要差不多700 KB的存储器),它们通常都需要外部存储器来存储,因为处理器很少会有足够的片内存储器来存哪怕是一帧的数据。但是如果防撞系统必须等到一帧完整的路面图像进入存储器之后才开始处理输入数据的话,就会损失33 ms的宝贵时间(假设帧率为30 Hz)。
为了保证最低的延时,视频数据可以送入片内的L1或L2存储器然后按照逐行的原则进行处理,从而实现快速计算,更快地得到结果。如果算法一次只能处理很少的几行,帧缓存器需求就很容易满足。NTSC视频的几行数据很容易进入L2存储器,因为L2存储器比片外的DRAM更接近内核处理器,这也可以显著地提高性能。
在这种框架中,处理器内核可以直接访问L2存储器中的视频数据。采用这种方式,编程模型与一般的基于PC的模型是相符的。为了保证数据的完整性,软件必须确保在当前帧处理完毕之前活动视频帧缓存器不会被新的数据覆盖。通过一种信号量机制,这是很容易控制的。在防撞系统中,每帧的处理结果都是一个判定——是否将有碰撞发生?因此,在这种情况下,就没有需要防止被覆盖的输出视频缓冲器。
性能优先于编程模型
这种情况通常注重算法,限制了目标处理器。一般地,开发工程师会设法让处理器“正好符合”其预期应用,所以他们不会把成本花在能力过剩的器件上。因此,这种“高效带宽”框架集中在取得最高的性能,其代价就是可能增加编程复杂度。对于这种情况,系统实现可能会花较长的时间,集成的难度要高一些,但是以低成本器件来设计带来的长期成本节省可能将证明额外的开发时间是合理的。在开发周期中的早期投入更多时间的原因就是数据流程的每一个方面都需要仔细地规划。当最终的数据流程构建好以后,就很难再重用了,因为要通过手工完成框架来满足特定的解决方案。
这里和前面的例子一样,视频数据行也可以送入L2存储器,内核可以根据需要直接访问它们用于预处理,延时比访问片外存储器要低。虽然这是一个很重要的侧面优势,但是这里采用L2存储器的目的是缓存几行的数据以便在相同方向进行成组的传送,以此提高外部存储器的总线性能。
编程难度优先于性能
第三种框架完全集中于获得最简单的编程模型,而可能付出一些性能代价。在这种情况下,面市时间通常是最重要的因素。它可能会造成器件超过规定的技术指标,这样一定会因为没有优化的编码造成大量空间的低效率。实际上,这种策略也提供了一种可升级的平台,因为一旦有可能集中优化应用代码时,处理器的带宽最终可以被释放出来。
任何一次处理多行数据并且不涉及压缩和解压缩的视频算法,都很适合采用这种框架。考虑一幅5×5的图像卷积核,用作一个边缘检测滤波器对输入视频行进行处理。对于优化的运算,内部存储器中的视频行数应该取最大值。典型的内核导航就是“回旋”,或者是从图像的左边移到右边,然后又从左边开始(在一页中读取码字时采用同样的过程)。这种回旋路线一直持续到内核到达整帧图像的最末。
从表面上看,这种卷积算法可以是一个经其它平台验证过的代码库中的一部分,而且最好不要改动它。因此,控制回旋需要对数据缓冲器进行操作来隐藏算法效果。因此,边界的数据可能会被丢弃,但是总的编程模型仍然完整无缺的。
尽管我们只讨论了很少的几种最常见的媒体处理框架,它们已经足以说明在多媒体环境中越来越普遍的数据和处理流程的类型。这里给出的模型可以用于具有更复杂的流程的系统中,因此可以缩短开发时间并加快面市时间。