第四章CCS软件优化复习课程
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
概述
1个时钟周期内让尽可能多的功能单元在执行 指令。 趋近8*主频(MHz) MIPS
前提:满足各种资源限制(resource bound) 途径:
(1)资源合理分配、充分使用 (2)算法映射结构
DSP适合对大量数据做相同的运算
概述
为实现高效代码,编程者必须熟练掌握以下几 个方面的知识: 处理器结构 编程语言:C、汇编、线性汇编 代码生成工具:编译器、汇编器、连接器
product = m[i] * n[i] ;
改写
LDH
*addr_a++,m
LDH
*addr_x++,n
MPY m,n,product
sum += product ; 改写为
ADD
sum,product,sum
C代码转换为线性汇编
将循环变量vptr(即count)减一;利用C6x指令 的条件执行功能通过对vptr是否为零的判断条 件执行跳转指令: if ( vptr!=0) then B loop
线性汇编
线性汇编文件使用“.sa”扩展名
线性汇编过程可以:
传递参数 返回结果 使用符号变量 不考虑流水线问题
写线性汇编代码举例—点积
写线性汇编代码举例—FIR滤波器
简写为
C代码转换为线性汇编
short DP(short *m, short *n, short count)
{
short i ;
前两句将数组a[ ]和x[ ]的首地址存入名为addr_a和 addr_x的寄存器变量,以便其后实现对数组的访问; 最后一句是累加寄存器清零。
C代码转换为线性汇编
第四步处理程序的循环体部分
定义一个标号loop:作为循环返回的标志;然后按照 原C程序语句顺序改写成汇编语句(不必指定指令执 行的功能单元):
short product ;
short sum = 0 ;
for(i=0;i<count;i++)
{
product = m[i] * n[i] ;
sum += product ;
}
return(sum) ;
}
线性汇编
实现上式,需要包括如下步骤: (1)加载采用点数据x[i] (2)加载滤波器系数h[i] (3)x[i]和h[i]相乘 (4)将(x[i]*h[i])加入累加和 (5)将循环进行步骤1to4共40次 (6)累加器中的累计和保存入变量y.
第四章CCS软件优化
主要内容
优化方法 软件流水 多周期循环流水线设计 理解软件优化结果的反馈信息
Baidu Nhomakorabea
优化方法
优化和优化过程概述(复习) 利用代码生成工具对C代码进行优化(复习) 汇编代码的优化
概述
程序优化:对软件代码进行处理以获得以下两 个主要目标: 更快的运行时间 更大的代码大小
Note: 一般在更快的执行速度和更小的代码大小之间 需要进行一个折中(trade off)
通过下述方法改进C语言程序,可以提供编译 出代码的性能:
1、使用intrinsics内联函数替代复杂的C语言程 序。
2、对短字长的数据使用宽长度的存储器访问— —数据打包处理(Packed Data Processing)
3、改进C语言循环程序,使之更有利于用软件 流水技术优化。
线性汇编语言简介
传递的参数
C代码转换为线性汇编
第二步:暂时存放临时数据的寄存器定名, 由.reg ( register)完成
.reg
addr_a,addr_x
.reg
m,n
.reg
product,sum
C代码转换为线性汇编
第三步,数据初始化
MV MV ZERO
cptr0,addr_a cptr1,addr_x sum
.endproc
结束
3、定义一个可被汇编优化器优化的线性汇编代码段的伪指令。
label .proc [vari1[,vari2,…]] 起始
.endproc
结束
线性汇编中的伪指令
4、表明存储器地址相关与不相关的伪指令
.mdep[symbol1],[symbol2] 1,2相关
.no_mdep 关
其后定义的函数段内存储器地址不相
最后,.return实现数据的返回。 一切工作完成后,使用.endproc作为函数结束
线性汇编语句的基本结构 线性汇编中的伪指令 线性汇编资源安排 C代码转换为线性汇编
线性汇编语句的基本结构
基本格式与汇编语言相同,必须是ASCII码文 件,扩展名必须是”.sa”,用作汇编优化器的 输入文件
Label[[:]] [||] [[register]] mnemonic [unit specifier] [operand list] [;commend]
5、定义变量,或者说描述存入寄存器的数值变量的伪指令:
.reg variable1[,variable2,…]
6、过程的返回值
.return [argument]
7、指出循环迭代次数的伪指令
label .trip minimum value
线性汇编资源安排
读取指令(LDH)必须使用.D单元 乘法指令(MPY)必须使用.M单元 加法指令(ADD)必须使用.L单元 减法指令(SUB)必须使用.S单元 跳转指令(B)必须使用.S单元
代码优化的三个层次
1、C语言级的优化 2、线性汇编优化 3、手工汇编优化
C语言级的优化 ——编译器选项
C优化编译器 使用ANSI C代码语言,可达到手工汇编代码 效率的80%。如选择-o2,-o3等
整个优化过程包括不同阶段、不同层次的优化。
必须掌握每个阶段、层次的优化知识。
C语言级优化 ——C语言程序优化
线性汇编中的伪指令
1、调用一个函数
.call [ret_reg=]func_name(arg1,arg2)(仅在过程procedure)内有效
2、定义一个可被汇编优化器优化,而且可被C/C++当做函数调用的线性 汇编代码段的伪指令。
label .cproc [vari1[,vari2,…]] 起始
C代码转换为线性汇编
第一步:定义函数名称、实现参数传递 short DP(short *m, short *n, short count)
.def _DP _DP .cproc cptr0,cptr1,vptr
1).def为definition的缩写 2).cproc表示本函数是C可调用函数,其后为所