浅论Viterbi算法(2)
作者:佚名; 更新时间:2014-12-05
?
*尽管软件流水循环可包含intrinsics,但不能包含函数调用。所以需要把调用函数hamm在循环中展开实现。?
*由于编译器仅对最内部的循环执行流水,所以为了提高性能应尽可能创造一比较大的内循环。在代码中可以看到,在最内循环是i的两次循环,仅对它进行流水,对整个代码的性能提高不大。所以一个想法是,将i和j循环全部展开,使编译器直接面对最大的C循环以最大发挥软件流水的作用。?
*另外,展开循环后代码中的变量如果可以确定其运行中的值,就尽量以实值代入,这样减少了变量个数,也就是减少了所需分配的寄存器个数(C62xxCPU中有32个寄存器)。?
在进行上述调整后运行代码,信捷职称论文写作发表网,进行测试发展,性能没有太大改善;用编译器反馈表(feedback)进行观察发现,循环并没有发生流水。这是为什么呢?原来在展开内部循环后导致C循环内代码尺寸太大,需要的寄存器数目大于C62XX的32个寄存器,所以不能进行软件流水。为了解决这问题,需要简化循环或将循环拆成几个小循环。在这里先将C循环内部的小循环展开,然后将其拆成分别完成度量计算和累计度量比较的两个循环,这样就减小了每个循环中的代码尺寸。?
其中accum_err_metric[i]为状态i的累计度量值,branch_metric_array[][]为计算得到的各时刻量值,原来代码中的二维数码mextstate[i]被以实值代入。另外在编程考虑时要注意一点:程序中对数据的取命令(load)是非常耗时的,所以应考虑尽量减少对数据数组的操作。在上面程序的改进中,先从数组中取出要进行循环处理的累计度量值,再运用accumXX及addX作为各次迭代的中间变量,在循环后将最后的结果放入数据。这样就大大减少了对数组的操作,从而使优化进一步提高。?
*编译器优化选项的选择。C6000 C/C编译器提供了大量的编译选项,供用户在编译时选择运用。这些选项中的部分会直接影响或控制编译器优化过程,因而会影响编译输出的代码优化性能。选择适合的选项,能极大地提高优化性能。在这里运用的优化选项有:?
-03——表示可得到最高程度的优化,编译器将执行各种优化循环的办法,如软件流水、循环展开等等。?
-pm——在运用-o3选项进行优化时尽量联合运用-pm选项,-pm是程序级优化,使优化器访问整个程序,了解循环次数。?
-op1——运用了外部变量,但未运用外部函数调用。?
-g——使能符号调试和汇编源语句调试。?
另外,还有不少考虑因素和优化调试办法,如消除存储器相关性、对短字长的数据运用宽离长度的存储器访问等。?
测试结果:在经过上述优化后运行耗时(时钟周期)已降为406个,代码的性能大为提高,已经满足系统要求。?
3.由上述可知,在程序中影响性能的主要代码通常是循环。优化一个循环较好的办法是抽出这个循环,使之成为一个单独文件,对其进行重新编写、重新编译和单独运行。为了提高代码性能,对影响速度的关键C代码段可以用线性汇编重新编写,运用汇编优化器进行优化后效率是非常高的。若代码性能仍未满足要求,则可进行第三阶段,将其抽出,全部用线性汇编来编写,在代码中以函数的形式将改写的部分调用。?
编写线性汇编的工作量大,开发周期长且不能像C语言程序一样移植到其他类型DSP上,所以尽量在第一、二阶段完成工作。若仍满足不了性能要求,则再对关键代码段进行线性汇编的改写。?
本文在TI的TMS320C6211硬件平台上实现了针对(2,1,3)卷积码的Viterbi译码算法的优化,满足了系统对2Mb/s的视频数据流进行实时处理的要求。在对1Kb数据处理时,整个代码运行耗时约为2100个时钟周期,DSP资源占用率不到40%。现在随着理论技术的不断突破,尤其是实时图像压缩技术如H.264等新一代技术标准的提出,如何利用高速DSP进行复杂算法的开发与实现,已成为研究的重点。所以本文以Viterbi算法为例介绍TMS320C6000的编程优化,有较强实用性。
[参考文献]?
[1]王晓东:《计算机算法设计与分析》,电子工业出版社2007年5月版。?
[2]梁循:《数据挖掘算法与应用》,北京大学出版社2006年4月版。?
[3]Pieter Adriaans:《文法推断:算法与应用》,湖南文艺出版社2002年12月版。
*尽管软件流水循环可包含intrinsics,但不能包含函数调用。所以需要把调用函数hamm在循环中展开实现。?
*由于编译器仅对最内部的循环执行流水,所以为了提高性能应尽可能创造一比较大的内循环。在代码中可以看到,在最内循环是i的两次循环,仅对它进行流水,对整个代码的性能提高不大。所以一个想法是,将i和j循环全部展开,使编译器直接面对最大的C循环以最大发挥软件流水的作用。?
*另外,展开循环后代码中的变量如果可以确定其运行中的值,就尽量以实值代入,这样减少了变量个数,也就是减少了所需分配的寄存器个数(C62xxCPU中有32个寄存器)。?
在进行上述调整后运行代码,信捷职称论文写作发表网,进行测试发展,性能没有太大改善;用编译器反馈表(feedback)进行观察发现,循环并没有发生流水。这是为什么呢?原来在展开内部循环后导致C循环内代码尺寸太大,需要的寄存器数目大于C62XX的32个寄存器,所以不能进行软件流水。为了解决这问题,需要简化循环或将循环拆成几个小循环。在这里先将C循环内部的小循环展开,然后将其拆成分别完成度量计算和累计度量比较的两个循环,这样就减小了每个循环中的代码尺寸。?
其中accum_err_metric[i]为状态i的累计度量值,branch_metric_array[][]为计算得到的各时刻量值,原来代码中的二维数码mextstate[i]被以实值代入。另外在编程考虑时要注意一点:程序中对数据的取命令(load)是非常耗时的,所以应考虑尽量减少对数据数组的操作。在上面程序的改进中,先从数组中取出要进行循环处理的累计度量值,再运用accumXX及addX作为各次迭代的中间变量,在循环后将最后的结果放入数据。这样就大大减少了对数组的操作,从而使优化进一步提高。?
*编译器优化选项的选择。C6000 C/C编译器提供了大量的编译选项,供用户在编译时选择运用。这些选项中的部分会直接影响或控制编译器优化过程,因而会影响编译输出的代码优化性能。选择适合的选项,能极大地提高优化性能。在这里运用的优化选项有:?
-03——表示可得到最高程度的优化,编译器将执行各种优化循环的办法,如软件流水、循环展开等等。?
-pm——在运用-o3选项进行优化时尽量联合运用-pm选项,-pm是程序级优化,使优化器访问整个程序,了解循环次数。?
-op1——运用了外部变量,但未运用外部函数调用。?
-g——使能符号调试和汇编源语句调试。?
另外,还有不少考虑因素和优化调试办法,如消除存储器相关性、对短字长的数据运用宽离长度的存储器访问等。?
测试结果:在经过上述优化后运行耗时(时钟周期)已降为406个,代码的性能大为提高,已经满足系统要求。?
3.由上述可知,在程序中影响性能的主要代码通常是循环。优化一个循环较好的办法是抽出这个循环,使之成为一个单独文件,对其进行重新编写、重新编译和单独运行。为了提高代码性能,对影响速度的关键C代码段可以用线性汇编重新编写,运用汇编优化器进行优化后效率是非常高的。若代码性能仍未满足要求,则可进行第三阶段,将其抽出,全部用线性汇编来编写,在代码中以函数的形式将改写的部分调用。?
编写线性汇编的工作量大,开发周期长且不能像C语言程序一样移植到其他类型DSP上,所以尽量在第一、二阶段完成工作。若仍满足不了性能要求,则再对关键代码段进行线性汇编的改写。?
本文在TI的TMS320C6211硬件平台上实现了针对(2,1,3)卷积码的Viterbi译码算法的优化,满足了系统对2Mb/s的视频数据流进行实时处理的要求。在对1Kb数据处理时,整个代码运行耗时约为2100个时钟周期,DSP资源占用率不到40%。现在随着理论技术的不断突破,尤其是实时图像压缩技术如H.264等新一代技术标准的提出,如何利用高速DSP进行复杂算法的开发与实现,已成为研究的重点。所以本文以Viterbi算法为例介绍TMS320C6000的编程优化,有较强实用性。
[参考文献]?
[1]王晓东:《计算机算法设计与分析》,电子工业出版社2007年5月版。?
[2]梁循:《数据挖掘算法与应用》,北京大学出版社2006年4月版。?
[3]Pieter Adriaans:《文法推断:算法与应用》,湖南文艺出版社2002年12月版。
下一篇:各种聚类算法及改进算法的研究
热门论文