7-1:C6000软件优化 概念和汇编优化
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
简单估计
指令 LDH,LDH MPY B ADD,SUB 功能单元 .D .M .S .L(.D/.S) 每周期可 需要数目 使用数目 2 2 2 2 2(2-6) 1 1 2
第三步:画相关图
画相关图步骤:
1 2 3
、画节点(包括:指令、结果、通路) 、在通路旁标出父指令执行周期 、安排功能单元
ADD .L1 A6,A7,A7 || ADD . L2 B6,B7,B7 || MPY . M1X A2,B2,A6 || MPYH . M2X A2,B2,B6 ADD .L1 A6,A7,A7 || ADD . L2 B6,B7,B7 || MPY . M1X A2,B2,A6 || MPYH . M2X A2,B2,B6 ADD .L1 A6,A7,A7 || ADD . L2 B6,B7,B7 || MPY . M1X A2,B2,A6 || MPYH . M2X A2,B2,B6 ADD .L1 A6,A7,A7 || ADD . L2 B6,B7,B7 || MPY . M1X A2,B2,A6 || MPYH . M2X A2,B2,B6 ADD .L1 A6,A7,A7 || ADD . L2 B6,B7,B7 || MPY . M1X A2,B2,A6 || MPYH . M2X A2,B2,B6 ADD .L1 A6,A7,A7 || ADD . L2 B6,B7,B7 ADD .L1 A6,A7,A7 || ADD . L2 B6,B7,B7
灌入循环
上述方法增加了近1/3代码: 5乘,7加 解决方法:保证ADD指令有效执行100次 ※ 将填充阶段的ldw、mpy都加到循环内核中; ※ 循环计数器 107; ※ Add指令要在7个周期后才能得到有效数据 (ldw 5,mpy 2);此前的add输入数据要清 零。 周期数:7+107+1=115
• 安排必须的功能单元 •
节点分配到A、B两侧
• 对所有节点分配功能单元Βιβλιοθήκη Baidu
平分.D、.S、.M 最小化交叉通路 平衡功能单元 仲裁
画点积相关图 1. 画节点(1)
画点积相关图 1. 画节点(2)
循环传递通路
画点积相关图 1. 画节点(3)
画点积相关图 2. 标出父指令执行周期
画点积相关图 3. 安排功能单元(1)
mv register1, .return sum : p_m
;建
.endproc mv
sum, register1 .endproc [register1[,register2, ]];给出返
保护寄存器
Dotp: .cproc .reg prod,sum,count
.reserve指出需要保护的寄存 器 当.cproc/ .endproc内的代码 明显 使用了要保护的寄存器,优化 器 p_m, p_n, count 也可能使用该寄存器,如:
参数传递
Dotp:
.cproc p_m, p_n, count .reg p_m, m, p_n, n, prod,sum,count zero sum .cproc [variable1[,variable2,]]: loop: ldh *p_m++, m 给出输入参数 ldh *p_n++, n .return:给出返回结果 mpy m, n, prod .return仅在.cproc/ .endproc add prod, sum, sum 内有效 [count] sub count, 1, count .proc [register1[,register2, ]]; 给出输入 .reg p_m, [count] b loop
使用并行指令
哪些指令可以并行?
并行指令
哪些指令可以并行? (1)两条取指令并行: •放“||”在第二个ldh前 •.d1改为.d2,A改为B
填充延迟间隙
NOP:相当于未优化
为了消除NOP,如何 调整指令顺序?
填充延迟间隙
Sub和b指令移到ldh 指令后: LD的nop由4降为 2 B的nop被消除
软件优化要点
1个时钟周期内让尽可能多的功能单元在执 行指令。 趋近8*主频(MHz) MIPS 前提:满足各种资源限制(resource bound) 途径: (1)资源合理分配、充分使用 (2)算法DSP结构的映射 DSP适合对大量数据做相同的运算
软件优化要点(续)
相同的工作放在一起完成,形成循环, 便于软件流水。 软件流水:单周期执行多个循环的不同 指令。 循环中工作太多,导致资源不够(如: 寄存器不够分配),则可以拆分循环。 充分利用指令局部性和数据局部性的特 点Cache
Basic knowledge
To implement efficient software, the programmer must be familiar with:
Processor architecture. Programming language (C, assembly or linear assembly). The code generation tools (compiler, assembler and linker).
移去多余的sub指令
如果点积超过6次,则可以去掉开始的6 次sub指令; 并且点积次数改为107-1=101; 最后填充阶段只有5个时钟周期; 总的时间:5+107+1=113
画点积相关图 3. 安排功能单元(2)
画点积相关图 3. 安排功能单元(3)
第四步:分配功能单元
根据功能单元和 交叉通路的使用, 可在单周期循环 内编排这些指令。
第四步:分配寄存器
第五步:建编排表(1)
循环填充长度
编排 周期
0
5
抽出最长数据通路 计算长度: 5+2+1=8周期 编排表列出0-7周期 填充:第0-6周期 循环:第7周期
第一步:用C语言实现算法
第二步:写C6x线性汇编代码
线性汇编不考虑: 功能单元 寄存器 延迟间隙 并行指令
确定优化代码段
Dotp:
loop: n
.cproc
zero ldh ldh mpy add sum *p_n++, m, n, prod, count, 1, loop *p_m++, m
.reg prod,sum,count
p_m, m, p_n, n,
zero sum loop: ldh *p_m++, m ldh *p_n++, .reg伪指令: n mpy m, n, prod 声明符号变量,变量由优化器 add prod, sum, sum 选择与功能单元一致的寄存器 .reg仅在.cproc/ .endproc内有 [count] sub count, 1, count 当变量为40/64bit时,变量使用 [count] b loop 寄存器对格式:如ahi:alo .endproc
LDW 线性汇编代码
并行汇编代码
点积相关图
迭代间隔编排表
软件流水汇编代码
循环内核
总周期数
ADD .L1X A7,B7,A4
奇数项、偶数项之和再相加,放入A4
总指令周期:100+7+1=108 100次循环,每个循环一个周期 最后一次循环,在ldw指令后第七个周期结束 ADD .L1X A7,B7,A4占一个周期 存在多余循环,寻址越界!如何去掉? 即从第101周期开始的循环的ldw会越界。
代码举例
这个循环执行5次需 要多少周期? (不考虑延迟间隙) 周期
非流水代码
流水代码
软件流水中的术语
填充
(建立循环)
循环
(单周期循环 3次迭代)
排空
(完成最后操作)
软件流水步骤
1 2 3 4
5
6
用C语言实现算法并验证 写C6x线性汇编代码(.sa) 画相关图 分配功能单元和寄存器 建流水编排表 将编排表转换为C6x并行汇编代码(.asm)
7:C6000 软件优化
齐美彬
信号与信息处理研究所
TI- HFUT DSP LAB
Two main goals of software optimisation
Faster execution time. Small code size
Trade off between the two goals
优化的3个层次
1. 手工汇编优化 2. 线性汇编优化 3. C语言级的优化 2&3 和编译器交流:Feedback of loop 资源分配情况设置-k编译器选项, 保留 asm文件 compilerassembly 目的: 软件流水
C6000手工汇编语言优化
并行指令 填充延迟间隙 展开循环 存取带宽优化(使用LDW/LDDW) 软件流水
填充延迟间隙优化结果
循环代码展开举例
循环展开: 减少B的开销, 但增 加代码尺寸
循环次数减少一半
字长优化
使用字访问半字数据 使用双字字访问字数据
使用LDH的点积
使用LDW进行优化
使用LDW/MPYH
软件流水
产生高性能循环代码 •执行并行指令 •填充延迟间隙 •充分使用功能单元 由开发工具产生 •由编译器选项-o2或o3引入 •汇编优化器/C优化器产生
7
填写指令建议
从最长数据通路开始 尽可能早开始(第0周期) 一旦确定指令执行的周期,在这以后的周期 内,连续发生各次迭代 倒推跳转和循环计数指令的发生周期
第五步:建编排表(2)
第六步:写汇编代码
执行40次
40次循环耗时: 40+7 cycle
例2 减少循环次数 C语言和内联函数
数据200 循环100次
消除多余循环
并行读数(LDW||LDW):100次 流水填充:7次 内核循环:93次( 95次乘法,93次加法) 其余的乘法、加法在循环后补上: 5次乘法(MPY、MPYH), 7次加法(ADD、ADD) (共7个周期) 总周期:7+93+7+1=108
消除越界:增加了代码 (5乘,7加)
.cproc/ .endproc:
确定要优化的代码段 必须成对使用 可作为C调用的函数
在汇编代码中使用 .proc/ .endproc 确定要优化的代码段, 它们也必须成对使用
prod
sum, sum [count] sub count [count] b
使用符号变量
Dotp: .cproc
p_m, m, p_n, n,
.reserve
zero
a3
sum loop: ldh *p_m++, m ldh *p_n++, n mpy m, n, prod add prod, sum, sum [count] sub count, 1, count [count] b loop .return sum .endproc