- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
【例5.4】 定点点积的C代码内循环的线性汇编指令。 LDH .D1 *A4++,A2 ; 从存储器加载ai LDH .D1 *A3++,A5 ; 从存储器加载bi MPY .M1 A2,A5,A6 ; ai * bi ADD .L1 A6,A7,A7 ; sum += (ai * bi) SUB .S1 A1,1,A1 ; 递减循环计数器 [A1] B .S2 LOOP ; 跳转到循环
5.2.1 点积的C代码
b)浮点点积的C代码 float dotp(float a[], float b[]) { int i; float sum; sum = 0; for(i=0; i<100; i++) sum += a[i] * b[i]; return(sum); }
5. *A3++,A5 ; ai * bi ; sum += (ai * bi) ; 递减循 LOOP
; ;
;
5.2.3 画相关性图
1. 定点点积 图5-1为例5.4中定点点积汇编指令的相关性图以及相应的寄存器分配。
5.2.3 画相关性图
2. 浮点点积 图5-2给出了例5.5浮点点积的相关图以及相应的寄存器分配框图。
5.2.4 非并行汇编代码与并行汇编代码
用同一个功能单元分配两个LDH指令,这样会降低循环的性能,因此,重新安 排功能单元以使代码并行执行,其相关性图如图5-3所示,并行汇编代码见例5.7。
5.2.4 非并行汇编代码与并行汇编代码
【例5.7】定点点积的并行汇编代码。 MVK .S1 100, A1 ;建立循环计数器 || ZERO .L1 A7 ; 累加器清零 LOOP: LDH .D1 *A4++,A2 ; 从存储器加载ai || LDH .D2 *B4++,B2 ; 从存储器加载bi SUB .S1 A1,1,A1 ; 循环计数器递减 [A1] B .S2 LOOP ; 跳转到loop NOP 2 ; 为LDH延迟时隙 MPY .M1X A2,B2,A6 ; ai * bi NOP ; 为MPY延迟时隙 ADD .L1 A6,A7,A7 ; sum += (ai * bi) ; 此处发生跳转e
; ai * bi
; sum += (ai * bi)
; 循环计数器递减 ; 跳转到loop
5.2.4 非并行汇编代码与并行汇编代码
分配两个LDW指令用了同一个功能单元,从而降低了循环的性能,因此,重新 安排功能单元以使代码并行执行,其相关性图如图5-4所示,并行汇编代码如例5.9。
5.2.4 非并行汇编代码与并行汇编代码
5.2.2 C代码转换为线性汇编
【例5.5】 浮点点积的C代码内循环的线性汇编指令 LDW .D1 从存储器加载ai LDW .D2 从存储器加载bi MPYSP† .M1 A2,A5,A6 ADDSP† .L1 A6,A7,A7 SUB .S1 A1,1,A1 环计数器 [A1] B .S2 跳转到循环
【例5.9】 浮点点积的并行汇编代码 MVK .S1 100, A1 || ZERO .L1 A7 LOOP: LDW .D1 *A4++,A2 || LDW .D2 *B4++,B2 SUB .S1 A1,1,A1 NOP 2 [A1] B .S2 LOOP MPYSP .M1X A2,B2,A6 NOP 3 ADDSP .L1 A6,A7,A7 ; 建立循环计数器 ; 累加器清零 ; 从存储体中加载ai ; 从存储体中加载bi ; 循环计数器递减 ; LDW 延迟时隙 ; 跳转到loop ; ai * bi ; MPYSP延迟时隙 ; sum += (ai * bi) ; 此处发生跳转
5.2.4 非并行汇编代码与并行汇编代码
1. 定点点积 【例5.6】 定点点积的非并行汇编代码。 MVK .S1 100, A1 ; 建立循环计数器 ZERO .L1 A7 ; 累加器清零 LOOP: LDH .D1 *A4++,A2 ; 从存储器加载ai LDH .D1 *A3++,A5 ; 从存储器加载bi NOP 4 ; 为LDH延迟一个时隙 MPY .M1 A2,A5,A6 ; ai * bi NOP ; 为MPY延迟一个时隙 ADD .L1 A6,A7,A7 ; sum += (ai * bi) SUB .S1 A1,1,A1 ;循环计数器递减 [A1] B .S2 LOOP ; 跳转到LOOP处 NOP 5 ; 为LOOP延迟时隙 ; 此处发生跳转
第5章 线性汇编优化代码
5.1 汇编优化器选项与伪指令 5.2 编写并行代码 5.3 软件流水 5.4 多周期循环的模迭代 5.5 循环传递路径 5.6 循环中的IF-Then-Else语句
5.7 循环展开 5.8 生命太长问题 5.9 消除冗余取数 5.10 存储体 5.11 软件流水外循环 5.12 同内循环一起条件执行外循环 5.13 通用目标文件格式(COFF)
5.2.4 非并行汇编代码与并行汇编代码
【例5.8】 浮点点积的非并行汇编代码 MVK .S1 100, A1 ZERO .L1 A7 清零 LOOP: LDW .D1 *A4++,A2 LDW .D1 *A3++,A5 NOP 4 ; 为LDW延迟时隙 MPYSP .M1 A2,A5,A6 NOP 3 ; 为MPYSP延迟时隙 ADDSP .L1 A6,A7,A7 NOP 3 ; 为ADDSP延迟时隙 SUB .S1 A1,1,A1 [A1] B .S2 LOOP NOP 5 ; 建立循环计数器 ; 累加器 ; 从存储器加载ai ; 从存储器加载bi
5.1 汇编优化器选项与伪指令
(1)-on选项 (2) -mt选项和no_mdep伪指令 (3) .mdep伪指令 (4) .mptr伪指令
(5) .trip伪指令
5.2 编写并行代码
5.2.1 点积的C代码 a)定点点积的C代码 int dotp(short a[], short b[]) { int sum, i; sum = 0; for(i=0; i<100; i++) sum += a[i] * b[i]; return(sum); }