【优化系列】之DSP优化方法
DATE: 2019-2-18
1、参考
2、DSP介绍和特点
DSP是英文Digital Signal Process的简称,即数字信号处理器,DSP芯片内部采用程序和数据分开的哈佛结构,具有特殊的DSP指令和不同的功能单元,实现多级流水操作,完成并行计算。可以用来快速实现各种数字信号处理算法。
DSP特点:
DSP芯片一般具有如下的一些主要特点:
- 单指令周期内可完成一次乘法和一次加法;
- 程序和数据空间分开,可以同时访问指令和数据;
- 可以并行执行多个操作;
- 流水线操作,使取指、译码和执行等操作可以重叠执行。
3、DSP常用优化方法
3.1、DMA
DMA:直接存储器存储模式,通常用于DDR和L2之间交换数据,这样可以减少Cache miss,加快DDR的读写速度,提高数据传输速率。
在DMA模式下,CPU只须向DMA控制器下达指令,让DMA控制器来处理数据的传送,数据传送完毕再把信息反馈给CPU,这样就很大程度上减轻了CPU资源占用率,可以大大节省系统资源。
DMA传输:
在实现DMA传输时,是由DMA控制器直接掌管总线,因此,存在着一个总线控制权转移问题。即DMA传输前,CPU要把总线控制权交给DMA控制器。而在结束DMA传输后,DMA控制器应立即把总线控制权再交回给CPU。
一个完整的DMA传输过程经过下面3个步骤:
CPU初始化DMA---->DMA启动----->DMA完成数据拷贝
DMA常用技巧:
乒乓操作
A组:数据拷贝—》数据计算----》数据拷贝----》数据计算
B组:初始化-----》数据拷贝-----》数据计算----》数据拷贝
3.2、编译选项
参考自:TI DSP TMS320C66x学习笔记之DSP优化经验
一、 c6x的编译的常用选项
(一)c6x的编译程序为“cl6x.exe”使用的方法
Cl6x [options] [filenames]
Cl6x: 编译程序
Options: 编译选项
Filenames: C或汇编源文件
说明:
编译选项是一个字母或者两个字母,对大小写不敏感。
编译选项的前面需要有一个“-”符号。
一个字母的选项可以合并在一起。比如“-sgq”与“-s -g -q”相同。
两个字母的选项如果第一个字母相同也可以合并在一起。比如“-mgt”与“-mg -mt”相同。
(二)有关优化的选项
-mt: 表示在程序中没有使用alaising技术,这使得编译器可以进行比较好的优化。
-o3: 对文件级别进行最强的优化,一般在编译时应该使用这个选项。但是在个别情况下使用这个选项优化程序可能会出现错误(-o2有相同现象,-o0和-o1不会出现错误)。可能是在优化循环,组织流水线的时候发生错误。如果有这种现象出现可以同时使用-g选项,程序优化就不会出现错误,但是优化效果会下降。另外可以调整程序的表达方式,可能会避免编译器发生错误。
-pm: 在程序级别进行优化。可以将所以文件联合在一起进行优化,主要有去掉没有被调用的函数、总是常数的变量以及没有使用的函数返回值。建议由程序员自己进行这种优化工作。使用这个选项在win98下编译可能会出现找不到编译程序的情况。
-ms0: 不使用冗余循环进行优化,减小程序的大小。一般情况下这个选项对程序大小的优化作用不明显。
-mh[n]:去掉流水线的epilog,减小程序的大小。这个选项的作用比较明显。但是有可能出现读取地址超出有效范围的问题,所以要在数据段的开始和结尾处增加一些pading,或者在分配内存时保证数组的前面和后面一段范围内都是有效的地址。可选的参数n给出这种pading的长度字节数。
(三)保留编译和优化信息的选项
-k: 保留优化后生成汇编语言文件。
-s: 汇编语言文件中加入优化信息,如果没有则加入C语言源程序作为注释。
-mw:在汇编语言文件加入软件流水线信息。
(四)有关调试和剖析的选项
-g: 允许符号调试,在“out”文件中包含符号信息和行号信息,可以在c语言级别进行调试和剖析。使用联合使用-g、-mt和-o3可以保证能够进行符号调试的情况下最大限度的优化。
-mg:允许profile优化后的程序。 在“out”文件中包含符号信息和很少的行号信息。允许在c语言的函数基本进行剖析。如果联合使用这两个选项,-g选项可能被忽略,结果与只用-mg相同。
(五)其它类型
-mln: 生成大内存模式的程序。
-ml0: 缺省情况下将集合变量(数组和结构)作为far型。
-ml1: 缺省情况下将全部函数作为far型
-ml2: 等于-ml0加-ml1
-ml3: 缺省情况下将全部数据和函数作为far型
(六)建议使用的编译方式
Cl6x -gk -mt -o3 -mw -ss “filename”
方式1用于程序的调试,这种方式具有比较强的优化能力,并且支持符号调试。在编译的过程中不会发生错误。由于生成的“out”文件中包含了符号信息和行号信息,所以比较大。
Cl6x -k -mgt -o3 -mw -ss “filename”
方式2用于程序的剖析(profile),这种方式的优化能力几乎最强(绝大多数情况下与方式3相同),并且支持对程序进行profile。文件中只包含了符号信息和很少的行号信息,所以“out”文件比较小。
Cl6x -k -mt -o3 -mw -ss “filename”
方式3用于最终的发行版本程序,可以对程序进行最强的优化,并且去掉了全部的符号和行号信息,所以“out”文件比较小。由多个文件组成的程序应该编写makefile,将编译参数放在该文件中,并在其中说明使用的编译器的版本号。
(七)连接参数
-heap: 指定堆的大小
-stack: 指定栈的大小
连接的各种选项应该统一放在“cmd”文件中
3.3、C代码优化
1、使用内嵌函数Intrinsic
TMS320C6000提供的内嵌函数是一种直接映射为内嵌TMS320C6000汇编指令的特殊函数,调用内嵌函数对程序的可读性影响不大,同时可以达到优化效果。内嵌函数用下划线(_)开头,使用方法同调用普通函数一样。
例如:_dotpu4, _extu
举个例子:
for(j=0; j<width; j++)
{
sum += data[j];
}
使用内嵌函数优化后:
for(j=0; j<width; j++)
{
sum += _dotpu4(_amem4(data[j],0x01010101));
}
2、利用软件流水
软件用于安排循环指令,使循环的多次迭代以并行方式执行,这也是DSP主频低、效率高的主要原因。当使用编译器的-o2和-o3选项时,编译器使用软件流水优化源代码并且从程序中收集相关的优化信息。
3、循环处理
(1)循环计数:逆序计数效率更高。
(2)消除冗余循环
(3)循环展开