同时使用C/汇编语言进行除错
汇编程序码的除错并非一件小事,它需要对如延迟和内存对齐限制等架构和机械层级问题有深入的了解。单纯地结合C语言程序代码与汇编程序码会使问题变得更加棘手,因为这样一来程序设计人员便得对C语言程序代码和汇编程序码间的连结进行除错。
进行混合应用程序除错的第一步就是隔离问题。假设汇编程序码的C语言层级实作维持不变,且C语言层级实作能正常作业,那么将汇编语言函数转换成 C语言实作并重新测试应用程序就变得相当容易。为了迅速检测问题,程序设计人员可以采用交互作业程序:每一个步骤都将一半的可疑函数转换为相应的C语言实作,这样一来程序设计人员在进行每一步时都只需测试前一步中一半的函数。
一旦有问题的汇编语言函数被确定,就应该同时调查单独汇编语言问题和C语言与汇编语言的连接问题。单独汇编语言问题的除错对汇编程序设计人员来说十分简单明了,但C语言与汇编语言的连接问题就有点麻烦。不同于单独的汇编语言问题,在查看汇编语言函数本身时,无法看见C语言与汇编语言的连接问题;为了找出这些问题,程序设计人员必须检查编译器的惯例,例如呼叫惯例和缓存器使用惯例。程序设计人员还必须检查编译器假设,例如汇编语言指令的行踪(重复前面提到的例子,CEVA-X1641编译器假设mov acX, rN指令绝不会作为汇编语言函数的第一条指令)。为了节省除错时间,程序设计人员应该在第一次实作汇编语言函数时验证是否所有的编译器惯例和假设都有遵循惯例。
H.264视讯编码器和AMR-NB
本文讨论的技术和方法已被CEVA公司用于各种应用程序中,包括视讯编译码器、音讯编译码器、语音编码器和装置驱动器。此外,本文所述的功能无论用在何种案例,均能显著地提升性能。
H.264视讯编码器是一个很好的研究案例。它在处理能力(通常以MHz衡量)及其它资源方面都有强烈需求,特别是在与音讯编译码器等其它类型的编译码器比较上。
CEVA公司利用其高阶CEVA-X16xx DSP核心系列及其MM2000多媒体平台,提供这种编码器所需的处理能力。
CEVA公司利用先进剖析技术确定这种编码器的关键函数,然后对它进行最佳化。编码器的关键函数最佳化过程是逐步完成的。首先,利用如汇编语言内嵌函数这样的先进功能全面地将函数最佳化成C语言;然后进一步将编译器提供的汇编程序码最佳化成汇编语言层级。
图6显示出透过对这种编码器关键函数进行最佳化过程所获得的性能改善。只有最后一个最佳化阶段涉及到全部汇编程序码范围;所有其它阶段都基于具有汇编语言内嵌函数的C语言程序代码。这些汇编语言内嵌函数主要用于SIMD(单指令多数据)作业,如avg_acW_acX_acZ_4b。这条指令对 8个输入字节执行字节平均,进而产生4字节。这种SIMD作业对执行大量字节层级运算的视讯编译码器而言相当实用(这也是为何CEVA-X16xx架构为字节层级的SIMD作业提供广泛支持的原因)。
AMR-NB(自适应多码率——窄频)是广泛应用在无线通讯应用的语音编译码器。CEVA已为其所有DSP核心建置该语音编码器;但为遵循本文主旨,我们在此只讨论CEVA-X1620建置。将这种语音编码器完全建置到汇编语言的情况相当常见,倘若使用本文提到的各种功能,C语言实作和CEVA -X1620编译器可达到与汇编语言实作竞争的结果。其中提升CEVA-X1620编译器性能的关键功能就是支持ETSI内嵌函数的功能。
图7显示了整个AMR-NB应用经过最佳化过程后在MCPS(每秒百万循环)上所获得的性能改善。只有最后的最佳化阶段涉及了全范围的汇编语言编码,所有其它阶段都基于具有ETSI内嵌函数和汇编语言内嵌函数等的C语言程序代码。
总之,H.264编码器和AMR-NB的案例清楚地显示了汇编语言实作的性能优势,但也显示出纯汇编语言实作并非首选的最佳化方法。利用高质量软件开发工具链提供的各种C语言和汇编语言功能,DSP程序设计人员不必用汇编语言建置整个应用程序也能达到令人满意的性能结果。正如本文所述,编写C语言和汇编语言混合程序代码不是一件简单的工作;不过,本文讨论的各种功能都有助于DSP工程师更轻松地完成这项任务。