当前位置:首页 > 嵌入式 > 嵌入式教程
[导读]DSP的汇编程序优化方法及实例分析

1 引言

  数字信号处理器(DSP)相对于模拟信号处理器有很大的优越性,表现在精度高,灵活性大,可靠性好,易于大规模集成等方面。随着半导体制造工艺的发展和计算机体系结构的改进,数字信号处理器的功能越来越强大,对信号处理系统的研究重点又重新回到软件算法上,而不再像过去那样过多地考虑硬件的可实现性。随着DSP运算能力的不断提高,能够实时处理的信号带宽也大大增加,数字信号处理的研究重点也由最初的非实时性应用转向高速实时应用。

  目前大多数DSP虽然都支持C语言编程,但是在实际工程应用中,最常用的方法是用C语言编写流程控制。搭建工程框架,具体的算法模块及比较耗时的功能模块还是采用汇编语言来编写。这是因为C语言虽然具有易读性、可移植性等优点,但是它不便于对系统硬件资源的直接控制,无法发挥DSP自身的特点,无法充分利用DSP系统结构中有限的资源。特别是在硬实时性系统中,用汇编语言进行编程可利用DSP自身硬件结构的特点对汇编程序进行优化与精简,往往能够使一些复杂的算法和功能模块在实时性方面取得非常好的效果。

  2 汇编程序优化

  DSP的种类繁多.各类DSP都有其自身的硬件特点,而对DSP汇编程序进行优化的过程就是根据程序自身特点充分利用DSP硬件资源的过程。因此,具体到不同的器件.其优化方式也不尽相同。目前比较流行的大多数DSF,都支持程序并行和软件流水,本文从这二方面出发,概括归纳出对汇编程序进行优化的一般方法。希望能够在对不同DSP汇编程序优化的过程中提供一些思考方式上的切人点。为了易于说明,笔者提供了一些实例,这些例子均是用AD公司TSl01系列电路的汇编语言编写的。

  2.1 加强程序并行

  程序的并行是汇编优化的关键。但是,在开始进行任何优化之前,必须了解从何处着手,首先了解瓶颈在何处。软件的某些部分可能只执行一次(初始化)或者只执行少数几次,费尽心思优化此部分代码并非明智之举,因为获得的整体节省效果是微乎其微。对程序的优化应将主要力量集中在最为费时的部分。

  (1) 循环展开达到并行

  通过对大量DSP程序的研究.可以发现整个程序比较耗时的部分往往是在1个或几个大的循环中。这些循环部分又往往可分为取数、处理、储存处理结果3个顺序执行的步骤,这3个步骤有明显的时间先后关系.只有取了数才能处理。处理后才能存储结果,这种时间上的相互依赖性为程序的并行带来了非常大的困难。

  循环展开是最常用的一种优化技巧。1次循环处理过程中的各语句是具有很强的时间先后顺序的,但是在连续2次循环过程中的各种语句却是相互独立的,它们是以相同的语句处理不同的数据。因此可以采用将循环次数减半,每2次(也可以是3次、4次等,应根据具体情况来确定,同时循环次数要做相应改变)循环合并为1次循环过程的方法来使程序并行,提高效率。

  例1是一段对图像进行二值化的代码的主要部分.是一段2次的循环,并未经过优化;实例2是将其循环展开,2次循环过程合并为1次循环的代码段(这里假设其每行像素个数为偶数,如果不为偶数只需在内循环外额外处理一个像素即可);实例3是循环展开并进行优化精简后的代码段。这3段代码均用TSl01的汇编语言编写,其中j4指向待处理的图像;i5指向处理后的图像;xrO、xrl分别为图像行、列个数;xr2为二值化的阈值,像素灰度值大于或等于该值的使其等于该值,而像素灰度值小于该值的设为零。

  实例1:

  lcO=xr0;;

  _Picture_Segment_Outter_Loop:

  lcl=xrl::

  _Picture_Segment_Inner_Loop:

  /*取图像各像素点*/

  xr3=[j4+=l];;

  /*像素灰度值与阈值比较,大于或等于阈值的

  令其等于阈值,小于闽值的置为零*/

  xcomp(r3,r2);;

  tf xalt;d0,xr3:0;;

  if nxalt;d0,xr3=xr2;;

  /*存储处理结果生成新图像*/

  [j5+=1]=xr3;;

  *内循环结束*/

  _Picture__Segment_Inner_Lcop_End:

  if nlcle,jump_Picture_Segment_Inner_Loop(p);;

  /*外循环结束*/

  _Picture_Segment_Outter_L,cop_End:

  if nlcOe,jump_Picture_Segment_Outter_Loop(p);;

  实例2:

  lcO=xrO;;

  /*将循环数减半*/

  xrl=lshift r0 by—l;;

  _Picture Segment_Outter_Loop:

  1cl=xrl::

  _Picture Segment Inner Loop:

  /*取图像各像素点*/

  xr3=[j4+=1];;

  /*像素灰度值与阚值比较,大于或等于阈

  值的令其等于阈值.小于阈值的置为零*/

  xcomp(r3,r2);;

  if xah;do,xr3=0;;

  if nxah;do,xr3=xr2;;

  /*存储处理结果生成新图像*/

  [j5+=l]=xr3;;

  /*循环扩展部分*/[!--empirenews.page--]
xr4=[j4+:1];;

  xeomp(r4,r2);;

  if xah;do,xr4=0;;

  ifnxah;do,xr4=xr2;;

  [j5+=1]=xr4;;

  内循环结束*/

  _Pieture_Segment_Inner_Loop_End:

  if nlele,jump_Picture_Segment Inner Loop(p);;

  外循环结束*/

  _Picture_segment_Outter_Loop_End:

  if nleoe,jump_Pieture_Segment_Outter_Loop(p);;

  实例3:

  lcO=xr0;;

  xrl=lshifi r0 by一1;;_

  _Picture_Segment_Outter_Loop:

  lcl=xrl;;

  _Picture_Segment_Inner_Loop:

  xr3=[j4+=l];;

  xeomp(r3,r2);xr4=[j4+=1];;(1)

  ifxalt;do,xr3=0;;

  if nxalt;do,xr3=xr2;;

  [j5+=l]=xr3;xcomp(r4,r2);;(2)

  /*循环扩展部分*/

  if xalt;do,xr4:0;;

  ifnxah;do,xr4=xr2;;

  [j5+=1]=xr4;;

  _Picture_Segment_Inner_Loop_End:

  if nlele,jump_Pieture_Segmem Inner Loop(p);;

  _Picture segment_Outter_Loop_End:

  if nleoe,jump_Picture_Segment_Outter_Loop(p);;

  如实例3中的(1)、(2)所示,下一循环的取数和与阈值比较语句同上一循环中的指令达到了并行。分别运行实例1与实例3并计算其每个像素所花费的时间,可知实例1中平均每个像素花费7.12个时钟周期,而实例3中平均每个像素花费5.12个时钟周期,比优化前少用了差不多2个时钟周期。

  (2)提前取数达到并行

  在循环外提前取数,彻底打破循环中各指令间时间的先后顺序,增强其独立性并最终达到并行的目的,这也是一种常用的方法。实例4利用此种方法,在实例3的基础上对实例1的代码段做了进一步的优化与精简。

  如实例4中所示,(1)在循环外提前进行了取数,并在(2)达到了并行,(3)、(4)对由于提前取数造成的指针移位和额外的赋值进行了修正。但是,在使用此方法进行精简优化时要特别注意循环结束后对指针的修正。经计算。实例4平均每个像素所花费的时间为4.18个指令周期。

  实例4:

  lcO=xrO::

  xrl=lshifi rO by-1;;

  _Picture_Segment_Outter_Loop:

  lcl=xrl::

  xr3=[j4=1];; (1)

  _Picture_Segment_Inner_Loop:[!--empirenews.page--]
xcomp(r3,r2);xr4=[j4+=1];;

  if xah;do,xr3=0;;

  ifnxalt;do,xr3=xr2;;

  [j5+=1]=xr3;xcomp(r4,r2);;

  /*循环扩展部分*/

  if xah;do,xr4=0;xr3=[j4+=1];;(2)

  if nxah;do.xr4=xr2;;

  [j5+=1]=xr4;;

  _Picture_Segment_Inner_Loop_End:

  if nlelejump_Pieture_Segment_Inner_Loop(p);;

  j4=j4一l;; (3)

  xr3=0;; (4)

  _Pictnre_Segment_Outter_Loop_End:

  if nleoe,jump_Pieture_Segment_0utter_Loop(p);;

  (3)改换语句达到并行

  有时,不同的语句利用不同的硬件资源可以得到相同的结果。换一条语句执行.改变原语句所用硬件资源。往往也能够增加程序的并行程度。例如DSP中往往提供独立的加法、乘法运算单元,同样一条赋值语句可以用加0或者乘l代替,这样就可以将原来不能并行的从内存中取数语句和对寄存器赋值语句(这两条语句都要到总线资源)并行起来。这在许多参考资料中都可以见到。在此不再列举具体实例。

  (4)增加取数个数达到并行

  某些DSP还支持联合取数的功能,其寄存器可能是32位.但是却支持64位数据的存取,即一条语句可完成二组数据的存取。而对这两组数据的处理却是相互独立、可以并行的,利用这一功能来达到优化,也不失为一种好方法。

  2.2 利用软件流水

  流水技术是提高DSP程序执行效率的另一种主要手段。它可以使若干条指令的不同执行阶段并行处理。有时由于相邻的几个指令行有可能使用相同的资源,其间又可能有相关性,从而使DSP在执行时自动插人延迟,使DSP的运行速度比预期的慢:有时又可能由于指令本身的原因造成延时(例如跳转指令),使得DSP的效率降低。由于流水技术本身的复杂性以及DSP硬件结构的多样性,这里不再讨论造成这种延迟的种种原因(事实上各个DSIC的使用手册中均有详细的说明),只是想告诉读者其实有时候只需要移动几条指令的位置就可以达到优化的目的。在这里仍继续采用实例1的代码段作为例子(TI公司C6000系列电路的编程更适合此例,只是其汇编指令太复杂)。

  如实例5(1)所示,它将例3中并行的语句重新分开,变为二条语句执行。计算其效率可以发现平均每个像素仍然花费5.12个指令周期,与将其并行的效率相同。这是因为取数与比较这二条指令共用了同一寄存器资源xr3,造成这二条语句间插入一个指令周期的延迟,而把语句插入到这两条指令之间,恰恰利用了这一延迟,达到了优化的效果。

  实例5:

  lc0=xr0;;

  xrl=lshift r0 by一1;;

  _Picture_Segment_Outter_Imp:

  lcl=xrl::

  _Picture__Segment_lnnell_Loop:

  xr3=[j4+=l];;

  xr4=[j4+=1];; (1)

  xcomp(r3,r2);;

  if xalt; d0,xr3=0;;

  if nxalt;d0,xr3=xr2;;

  [j5+=1]=xr3;xcomp(r4,r2);;

  if xalt; d0,xr4=0;;

  if nxalt;d0,xr4:xr2;;

  [j5+=1]=xr4;;

  _Picture_Segment_Innerl_Loop_End:

  if nlcle,jump_Picture_Segment_Inner_Loop(p);;

  _Picture_Segment_Outter_Loop_End:

  if nlcoe~jump_Picture_Segment_Outter_Loop(p);;

  对汇编程序进行优化,应综合上面提到的各种方法。首先使循环内各语句在时间关系上尽量相互独立.然后利用种种技巧最大限度地使语句并行;最后再考虑软件流水造成的延时,调整各条语句的位置.尽量减少延时。

  3 结束语

  对特定DSP汇编程序进行优化的过程就是对其芯片结构充分熟悉利用的过程,程序优化与精简的程度正比于对芯片结构的熟悉程度。这是一个不断深入、永无止境的过程。但是还应看到,在程序达到高效的同时,牺牲的是程序应有的可读性。在软件高度产业化的今天,程序的可读性有时甚至比其高效性更为重要。因此如何在程序达到高效的同时尽量保证其可读性也是在对程序进行优化时应着重考虑的问题。

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

9月2日消息,不造车的华为或将催生出更大的独角兽公司,随着阿维塔和赛力斯的入局,华为引望愈发显得引人瞩目。

关键字: 阿维塔 塞力斯 华为

加利福尼亚州圣克拉拉县2024年8月30日 /美通社/ -- 数字化转型技术解决方案公司Trianz今天宣布,该公司与Amazon Web Services (AWS)签订了...

关键字: AWS AN BSP 数字化

伦敦2024年8月29日 /美通社/ -- 英国汽车技术公司SODA.Auto推出其旗舰产品SODA V,这是全球首款涵盖汽车工程师从创意到认证的所有需求的工具,可用于创建软件定义汽车。 SODA V工具的开发耗时1.5...

关键字: 汽车 人工智能 智能驱动 BSP

北京2024年8月28日 /美通社/ -- 越来越多用户希望企业业务能7×24不间断运行,同时企业却面临越来越多业务中断的风险,如企业系统复杂性的增加,频繁的功能更新和发布等。如何确保业务连续性,提升韧性,成...

关键字: 亚马逊 解密 控制平面 BSP

8月30日消息,据媒体报道,腾讯和网易近期正在缩减他们对日本游戏市场的投资。

关键字: 腾讯 编码器 CPU

8月28日消息,今天上午,2024中国国际大数据产业博览会开幕式在贵阳举行,华为董事、质量流程IT总裁陶景文发表了演讲。

关键字: 华为 12nm EDA 半导体

8月28日消息,在2024中国国际大数据产业博览会上,华为常务董事、华为云CEO张平安发表演讲称,数字世界的话语权最终是由生态的繁荣决定的。

关键字: 华为 12nm 手机 卫星通信

要点: 有效应对环境变化,经营业绩稳中有升 落实提质增效举措,毛利润率延续升势 战略布局成效显著,战新业务引领增长 以科技创新为引领,提升企业核心竞争力 坚持高质量发展策略,塑强核心竞争优势...

关键字: 通信 BSP 电信运营商 数字经济

北京2024年8月27日 /美通社/ -- 8月21日,由中央广播电视总台与中国电影电视技术学会联合牵头组建的NVI技术创新联盟在BIRTV2024超高清全产业链发展研讨会上宣布正式成立。 活动现场 NVI技术创新联...

关键字: VI 传输协议 音频 BSP

北京2024年8月27日 /美通社/ -- 在8月23日举办的2024年长三角生态绿色一体化发展示范区联合招商会上,软通动力信息技术(集团)股份有限公司(以下简称"软通动力")与长三角投资(上海)有限...

关键字: BSP 信息技术
关闭
关闭