一站式电子元器件采购平台

华强商城公众号

一站式电子元器件采购平台

元器件移动商城,随时随地采购

华强商城M站

元器件移动商城,随时随地采购

半导体行业观察第一站!

芯八哥公众号

半导体行业观察第一站!

专注电子产业链,坚持深度原创

华强微电子公众号

专注电子产业链,
坚持深度原创

电子元器件原材料采购信息平台

华强电子网公众号

电子元器件原材料采购
信息平台

增强开源应用程序中的处理器性能

来源:analog 发布时间:2024-02-19

摘要: 了解嵌入式处理应用程序中开源的挑战。

随着“开源”C/ c++算法在嵌入式处理应用程序中成为基于版税的代码的日益流行的替代方案,它们带来了新的技术挑战。其中最重要的是如何优化获得的代码,使其在选定的处理器上良好地工作。这个问题至关重要,因为为给定处理器家族编写的编译器将利用该处理器的优势,但可能会以其他方面的低效率为代价。当相同的算法直接在不同的平台上开箱即用运行时,性能可能会下降。本文将探讨如何将此类开源算法移植到Devices Blackfin 处理器上,并在此过程中概述一个用于代码优化的“攻击计划”。

什么是开源?

一般理解的“开放源代码”的定义是指任何具有可供其他程序员使用的源代码的项目。开源软件通常是在软件程序员社区内协作开发并免费分发的。例如,Linux操作系统就是这样开发的。如果一切顺利,结果将提供一个不断发展的、健壮的、经过良好测试的应用程序,因为许多不同的应用程序都利用了这些代码。程序员被鼓励使用代码,因为他们不必为代码付费或自己开发代码,从而加快了他们的项目进度。他们对代码的成功使用提供了进一步的测试信息。

“开放源代码”的认证印章归开放源代码促进会(OSI)所有。如果发布条款符合OSI的开放源代码定义,开发和发展的代码可以使用开放源代码商标。这要求软件在一定的指导下重新分发给其他人。例如,在通用公共许可证(GPL)下,源代码必须是可用的,以便其他开发人员能够改进或发展它。

Ogg是什么?

有一个完整的开发人员社区致力于为数字媒体创建开放标准和应用程序。一个这样的群体是Xiph。Org基金会是一家非营利性公司,其宗旨是支持和开发免费、开放的协议和软件,以服务于公众、开发者和商业市场。这个伞形组织(参见图1)监督诸如视频(Theora)、音乐(有损Vorbis和无损Flac)和语音(Speex)编解码器等技术的管理。


图1所示。开源“保护伞”

术语Ogg表示保存多媒体数据的容器格式。它通常用作生成数据的特定编解码器的前缀。Vorbis,一个我们将在这里讨论的音频编解码器,使用Ogg作为文件来存储它的比特流,所以它通常被称为“Ogg Vorbis”,事实上,一些便携式媒体播放器被宣传为支持Ogg文件,其中“Vorbis”部分是隐含的。Speex,下面讨论的语音编解码器,也使用Ogg格式将其比特流作为文件存储在计算机上。然而,网络语音协议(VoIP)和其他实时通信系统不需要文件存储能力,而像实时传输协议(RTP)这样的网络层被用来封装这些流。因此,即使是Vorbis在通过多播分发服务器在网络上传输时也可能丢失其Ogg外壳。

什么是Vorbis?

Vorbis是一种完全开放、无专利、免版税的音频压缩格式。在许多方面,它在功能上与无处不在的MPEG-1/2 layer 3 (MP3)格式和较新的MPEG-4 (AAC)格式非常相似。这种编解码器设计用于中高质量(8-kHz至48-kHz带宽,16位,复调)音频,比特率从16到128 kbps/通道,因此它是一种理想的音乐格式。

最初的Vorbis实现是使用浮点算法开发的,主要是因为编程容易,从而可以更快地发布。由于大多数电池供电的嵌入式系统(如便携式MP3播放器)使用更便宜、更节能的定点处理器,开源开发人员社区创建了Vorbis解码器的定点实现。这个名为“震颤”的定点Vorbis解码器的源代码是在许可下发布的,该许可允许它被纳入开源和商业系统。

在为移植Vorbis解码器选择特定的定点架构之前,分析从压缩比特流中恢复音频所涉及的处理类型是很重要的。Vorbis解码过程(以及其他类似算法)的通用处理器流程如图2所示。像许多其他解码算法一样,有两个主要阶段:前端和后端。


图2。通用处理器流程的Vorbis解码过程。

在前端阶段,主要活动是头和包解包、表查找和霍夫曼解码。此类操作涉及大量条件代码和相对较大的程序空间,因此嵌入式开发人员通常使用微控制器作为前端。

后端处理由过滤函数、逆变换和一般向量操作定义。与前端阶段相比,后端阶段涉及更多的循环构造和内存访问,通常使用较少的代码。由于这些原因,嵌入式系统中的后端处理一直由成熟的dsp主导。

Blackfin处理器架构统一了微控制器(MCU)和DSP功能,因此不再需要两个单独的设备。它可以有效地在单个芯片上实现前端和后端处理。

Speex是什么?

Speex是一种开源的、无专利的音频压缩格式,专为语音设计。Vorbis用于压缩所有类型的音乐和音频,而Speex仅针对语音。因此,Speex在相同质量水平下的语音效果要比Vorbis好得多。

就像Vorbis与MP3和AAC等基于版税的算法竞争一样,Speex在语音编解码器市场上与GSM-EFR和G.72x算法(如G.729和G.722)共享空间。Speex还有许多其他编解码器所没有的特性。其中包括可变比特率(VBR),在同一比特流中集成多个采样率(8 kHz, 16 kHz和32 kHz),以及立体声编码支持。此外,Speex最初的设计目标是促进与互联网应用程序的结合,因此它是VoIP电话系统的一个非常有能力的组件。

除了其独特的技术特点外,Speex还有一个主要优点,那就是它“不需要任何成本”,而且可以根据特定的应用进行分发和修改。源代码在与Vorbis类似的许可下发布。由于该项目的维护者意识到将Speex嵌入小型定点处理器的重要性,定点实现已被纳入主代码分支中。

在Blackfin处理器上优化Vorbis和Speex

当将现有的应用程序(如Vorbis或Speex)移植到新的处理器时,立即“开箱即用”的代码性能是最重要的考虑因素。然而,软件工程师可以通过熟悉许多可用于优化整体性能的技术来获得很大的回报。有些只需要很少的额外努力。

将任何软件移植到像Blackfin这样的嵌入式处理器的第一步是定制低级I/O例程以适应系统需求。例如,Vorbis和Speex的参考代码都假设数据来自一个文件,处理后的输出存储在一个文件中(主要是因为这两个实现最初都是为了在Unix/Linux系统上运行而开发的,其中文件I/O例程可用)。然而,在嵌入式媒体系统中,输入和/或输出通常连接到在数字和现实世界域之间转换的A/D和D/A数据转换器。图3显示了一个可能的基于vorbis的媒体播放器实现的概念概述。输入位流从闪存传输,解码器输出驱动音频DAC。此外,虽然一些媒体应用程序(例如,便携式音乐播放器)仍然使用文件来存储数据,但许多系统用网络连接取代了存储。


图3。示例:Vorbis媒体播放器实现。

当优化像Vorbis解码器这样的系统以使其高效运行时,有一个有组织的攻击计划是个好主意。一种可能性是首先从C语言内部优化算法,然后简化系统数据流,最后在汇编级别调整代码的各个部分。图4演示了通过连续的优化步骤减少处理器负载的典型示例,并展示了这种方法的效率。


图4。在Blackfin上优化Vorbis源代码的步骤,可以显著降低处理器利用率。

编译器优化

对于代码优化来说,最有用的工具可能是一个好的分析器。使用VisualDSP++ for Blackfin中的统计分析器,程序员可以快速关注处理器执行代码时出现的热点。在许多实现中,20%的代码需要80%的处理时间。专注于这些关键部分会产生最高的边际回报。事实证明,循环是像Vorbis这样的媒体算法优化的主要候选者,因为密集的数字运算通常发生在循环内部。

还有一些代码优化的全局方法。首先,编译器可以对内存节约或速度进行优化。此外,可以考虑使用函数将汇编指令自动内联到C代码中。(编译器的内联关键字用于指示函数应该在调用点内联生成代码。这样做可以避免各种成本,例如程序流延迟、函数进入和退出指令以及参数传递开销。)这也造成了空间和速度之间的权衡。最后,像Blackfin这样的编译器可以使用两阶段过程来派生单个项目中各种源文件之间的关系,从而进一步加快代码执行(过程间分析)。

如上所述,大多数媒体算法的参考软件都使用浮点运算。但是,考虑到分数定点机器编写的软件仍然遗漏了一个关键部分。大多数编解码器算法选择的语言是C语言,但是C语言“原生”不支持使用小数定点数据。由于这个原因,许多小数不动点算法是用整数数学模拟的。这可能使代码具有很高的可移植性,但它无法达到用特定于机器的编译器结构重写一些数学函数以获得最高计算效率所能达到的性能。

图5中显示了一个说明这一点的具体示例。左列显示了C代码和Blackfin编译器输出的模拟分数算术,可在所有整数机器上工作。一次执行32位小数乘法的调用需要80个周期。右列显示了通过使用(mult_fr1x32x32)可以获得的性能改进,这是Blackfin编译器的一个内在函数,它利用了底层的分数硬件。通过这个相当简单的修改,实现了86%的加速。


图5。编译器内部函数是一个重要的优化工具。

系统优化

系统优化从正确的内存布局开始。在最好的情况下,所有代码和数据都可以放入处理器的L1内存中。不幸的是,这并不总是可能的,特别是在网络应用程序中实现大型基于c的应用程序时。

真正的困境是,处理器被优化为通过直接内存访问(DMA)独立于核心移动数据,但MCU程序员通常使用缓存模型运行。虽然核心读取是不可避免的现实,但为了保持性能,必须使用DMA或缓存进行大规模传输。

为了介绍这个讨论,让我们考虑一下Blackfin总线体系结构所固有支持的几个属性。首先是在没有核心干预的情况下仲裁请求的能力。由于内部存储器通常是在子库中构造的,DMA控制器和核心的同时访问可以通过将数据放置在单独的库中而在一个周期内完成。例如,当DMA填充第二个子库中的新缓冲区时,核心可以对一个子库中的数据进行操作。在一定条件下,同时访问同一子库也是可能的。

通常只有一个物理总线可用于访问外部存储器。因此,仲裁功能变得更加重要。这里有一个例子可以澄清这个挑战:在任何给定的周期中,可以访问外部内存位置来填充指令缓存,同时它作为传入和传出数据的源和目的地。

指令执行

Blackfin处理器使用分层内存架构,努力平衡具有不同大小和性能水平的多个级别的内存。片上L1内存最靠近核心处理器,以全时钟速率工作。该内存可以配置为SRAM和/或缓存。需要最确定性的应用程序可以在单核时钟周期内访问片上SRAM。对于需要较大代码大小的系统,可以使用额外的片内和片外内存,但延迟会增加。

SDRAM比L1 SRAM慢,但是对于存储大型程序和数据缓冲区是必需的。但是,程序员有几种方法可以利用快速L1内存。如果目标应用程序直接适合L1内存,那么程序员只需将应用程序代码直接映射到这个内存空间(如上所述的Vorbis示例),就不需要任何特殊操作。

如果应用程序代码对于内部内存来说太大,例如在向Vorbis编解码器添加网络组件时,可以使用缓存机制来允许程序员访问更大、更便宜的外部内存。缓存可以在需要时自动将代码放入L1内存。一旦进入L1,代码就可以在一个单核周期内执行,就像它最初存储在芯片上一样。这个过程的主要优点是程序员不必管理代码进出缓存。

当正在执行的代码本质上有点线性时,使用缓存是最好的。指令缓存实际上执行两个角色。首先,它有助于以更有效的方式从外部内存预取指令。此外,由于缓存通常使用某种类型的“最近最少使用”算法,因此最常运行的指令通常保留在缓存中。因此,如果代码已经被获取了一次,并且还没有被替换,那么它将为下一次通过循环执行做好准备。

谨慎的实时程序员不相信缓存可以获得最佳的系统性能,因为如果在需要执行时指令块不在缓存中,系统性能将会降低。这个问题可以通过利用缓存锁定机制来避免。当关键指令被加载到缓存中时,可以锁定缓存线以防止这些指令被替换。这允许程序员在缓存中保留他们需要的内容,并允许不太关键的指令由缓存机制本身管理。这种能力使Blackfin处理器与其他信号处理器区别开来。

数据管理

讨论了如何最好地管理代码以提高此应用程序的性能之后,现在让我们考虑数据移动的选项。作为缓存的替代方案,可以使用独立于核心的DMA控制器将数据移入和移出L1内存。当核心在内存的一个部分上操作时,DMA正在引入下一个要处理的数据缓冲区。

Blackfin数据存储架构对整个系统性能和指令时钟速度一样重要。由于在多媒体应用程序中,在任何时候都经常发生多个数据传输,因此总线结构必须支持对内部和外部存储器的所有区域的核心和DMA访问。自动处理DMA控制器和核心的仲裁是至关重要的,否则性能将大大降低。核心到DMA的交互应该只在设置DMA控制器时才需要,然后在准备好处理数据时响应中断。此外,数据缓存还可以提高整体性能。

在默认模式下,Blackfin执行数据提取作为基本核心功能。虽然这通常是传输数据效率最低的机制,但它产生了最简单的编程模型。快速刮刮板存储器通常作为L1存储器的一部分可用;但是对于更大的片外缓冲区,如果内核必须读取所有内容,则访问时间将受到影响。它不仅需要多个周期来获取数据,而且内核也将忙于获取数据。

因此,只要有可能,就应该始终使用DMA来移动数据。Blackfin处理器具有DMA功能,可以在外设和内存之间以及不同内存段之间传输数据。例如,我们的Vorbis实现使用DMA将音频缓冲区传输到音频D/A转换器。

对于这个音频应用程序,使用“旋转门”双缓冲方案来容纳DMA引擎。当环形双缓冲区的一半被串行端口DMA清空时,另一半被解码的音频数据填充。为了限制压缩数据的解码速率,DMA中断服务例程(ISR)修改了一个信号量,解码器可以读入这个信号量,以确保写入双缓冲区的特定一半是安全的。在没有操作系统(OS)的设计中,轮询信号量意味着浪费CPU周期;然而,在操作系统下,调度器可以切换到另一个任务(如用户界面),以使处理器忙于实际工作。

如果不考虑数据一致性,使用DMA可能会导致不正确的结果。由于这个原因,与音频DAC相关联的音频缓冲区被放置在一个不可缓存的内存空间中,因为缓存可能会保存比要由DMA传输的缓冲区更新的数据版本。

组合优化

优化的最后阶段是用汇编语言重写开放源代码C代码的独立片段。通过程序集重写来提高性能的最佳候选程序通常是中断服务例程(isr)和可重用的信号处理模块。

用汇编编写中断处理程序的动机是低效的ISR会减慢其他中断处理程序的响应速度。例如,某些音频设计必须使用音频ISR为音频DAC格式化AC97数据绑定。由于这种情况周期性地发生,较长的音频ISR可能会减慢其他事件的响应速度。减少中断处理程序周期计数的最好方法是在汇编中重写它。

可重用信号处理模块的一个好例子是后端Vorbis处理中使用的改进离散余弦变换(MDCT),将时域信号转换为频域表示。编译器永远不能像熟练的汇编程序员那样生成“紧凑”的代码,因此C版本的MDCT效率很低。同一功能的汇编版本可以利用Blackfin架构的硬件特性,如单周期蝶式加减和硬件位反转。

今天,Vorbis和Speex的Blackfin端口都存在,并可根据要求提供。这些端口运行在ADSP-BF533 EZ-KIT Lite上。μClinux的开源端口也可以在blackfin.uclinux.org上获得。总之,这些使各种各样的应用程序,寻求集成免版税的言论或音乐功能,同时保留大量的处理空间,为额外的特性和功能。例如,具有集成以太网mac的新型ADSP-BF536和ADSP-BF537为低成本网络音频和语音应用打开了大门。显然,开源代码预示着嵌入式处理领域的一场革命,而Blackfin处理器已经准备好充分利用这一形势。

参考电路

帕里斯,克里夫和菲尔·赖特。数字音频解码器的实现问题和权衡。英国蒙茅斯郡:ESPICO, Ltd。

声明:本文观点仅代表作者本人,不代表华强商城的观点和立场。如有侵权或者其他问题,请联系本站修改或删除。

社群二维码

关注“华强商城“微信公众号

调查问卷

请问您是:

您希望看到什么内容: