FP循环中的最少Sta数 1 Loop: LD FO,O(R1) 23 SUBI R1.R1.8 ADDD F4F0F2 stall 5 BNEz R1, Loop; delayed branch SD 8(R1), F4 altered when move past SUBI Swap BNEZ and SD by changing address of SD 6 clocks:通过循环展开4次是否可以提高性能?
6 clocks: 通过循环展开4次是否可以提高性能? 1 Loop: LD F0,0(R1) 2 SUBI R1,R1,8 3 ADDD F4,F0,F2 4 stall 5 BNEZ R1,Loop ;delayed branch 6 SD 8(R1),F4 ;altered when move past SUBI Swap BNEZ and SD by changing address of SD 2021/2/7 12 FP 循环中的最少Stalls数
FP循环中的 Stalls 1 Loop LD FO, O(R1) F0=vector element stal 23456789 ADDD F4F0F2 g add scalar in F2 stall stall O(R1), F4 , store result SUBI R1.R1.8 g decrement pointer 8B DW) stall BNEZ R1, Loop branch R1lzero 10 stall g delayed branch slot 产生结果的指令使用结果的指令 所需的延时 FP ALU op Another FP ALU op FP ALU op Store double Load double FP ALU op Load double Store double 32100 Integer op Integer op 10 clocks:是否可以通过调整代码顺序使sall减到最小
10 clocks: 是否可以通过调整代码顺序使stalls减到最小 1 Loop: LD F0,0(R1) ;F0=vector element 2 stall 3 ADDD F4,F0,F2 ;add scalar in F2 4 stall 5 stall 6 SD 0(R1),F4 ;store result 7 SUBI R1,R1,8 ;decrement pointer 8B (DW) 8 stall ; 9 BNEZ R1,Loop ;branch R1!=zero 10 stall ;delayed branch slot 产生结果的指令 使用结果的指令 所需的延时 FP ALU op Another FP ALU op 3 FP ALU op Store double 2 Load double FP ALU op 1 Load double Store double 0 Integer op Integer op 0 2021/2/7 计算机体系结构 13 FP 循环中的Stalls
O循环展开4次( (straight forward way) Loop: LD Fo,O(R1)stall ADDD F4F0F2 stal stall SD 0(R1),F4 g drop sUBl BNEZ 3456789 LD F6, 8(R1)stall ADDD F8.F6F2 stallstall SD -8(R1,F8 drop sUBI BNEZ LD F10,-16(R1) stall ADDD F12F10F2 stall stall SD -16(R1),F12 drop sUBl BNEZ 10 LD F14, 24(R1)stall ADDD F16F14.F2 stall stall 12 SD -24(R1),F16 34 SUB R1R132 stall alter to 4*8 BNEZ R1 LOOP 15 NOP Rewrite loop to minimize stalls? 15+4x(1+2)+1=28 cycles, or 7 per iteration Assumes R1 is multiple of 4
Rewrite loop to minimize stalls? 1 Loop: LD F0,0(R1) stall 2 ADDD F4,F0,F2 stall stall 3 SD 0(R1),F4 ;drop SUBI & BNEZ 4 LD F6,-8(R1) stall 5 ADDD F8,F6,F2 stall stall 6 SD -8(R1),F8 ;drop SUBI & BNEZ 7 LD F10,-16(R1) stall 8 ADDD F12,F10,F2 stall stall 9 SD -16(R1),F12 ;drop SUBI & BNEZ 10 LD F14,-24(R1) stall 11 ADDD F16,F14,F2 stall stall 12 SD -24(R1),F16 13 SUBI R1,R1,#32 stall ;alter to 4*8 14 BNEZ R1,LOOP 15 NOP 15 + 4 x (1+2) + 1 = 28 cycles, or 7 per iteration Assumes R1 is multiple of 4 2021/2/7 14 循环展开4次(straight forward way)
Stalls数最小的循环展开 1Lo。p:LDF0,0(R1) LD F6,-8(R1) F10,-16(R1) 2345678901 LDF14,24(R 代码移动后 ADDD F4F0F2 SD移动到SUB|后,注意偏移量 ADDD F8.F6F2 的修改 ADDD F12F10F2 · Loads移动到SD前,注意偏移量 ADDD F16F14.F2 的修改 SD0(R1),F4 SD8(R1),F8 sUB|R1,R1,#32 12 SD 16(R1),F12 13 BNEZ R1LOOP 14 SD 8(R1)F16 8-32=-24 14 clock cycles, or 3. 5 per iteration 计算机体系结构
• 代码移动后 • SD移动到SUBI后,注意偏移量 的修改 • Loads移动到SD前,注意偏移量 的修改 1 Loop: LD F0,0(R1) 2 LD F6,-8(R1) 3 LD F10,-16(R1) 4 LD F14,-24(R1) 5 ADDD F4,F0,F2 6 ADDD F8,F6,F2 7 ADDD F12,F10,F2 8 ADDD F16,F14,F2 9 SD 0(R1),F4 10 SD -8(R1),F8 11 SUBI R1,R1,#32 12 SD 16(R1),F12 13 BNEZ R1,LOOP 14 SD 8(R1),F16 ; 8-32 = -24 14 clock cycles, or 3.5 per iteration 2021/2/7 计算机体系结构 15 Stalls数最小的循环展开
循环展开示例小结 循环展开对循环间无关的程序是有效降低 stal的手段(对循环级并行) 指令调度,必须保证程序运行的结果不变 注意循环展开中的Load和 Store不同次循环 的Load和 Store是相互独立的。需要分析对 存储器的引用,保证他们没有引用同一地址 不同次的循环,使用不同的寄存器 删除不必要的测试和分支后,需调整循环步长 等控制循环的代码 移动SD到SUB和BNEz后,需要调整SD中的 偏移
2021/2/7 16 循环展开示例小结 • 循环展开对循环间无关的程序是有效降低 stalls的手段(对循环级并行). • 指令调度,必须保证程序运行的结果不变 • 注意循环展开中的Load和Store,不同次循环 的Load 和Store 是相互独立的。需要分析对 存储器的引用,保证他们没有引用同一地址. • 不同次的循环,使用不同的寄存器 • 删除不必要的测试和分支后,需调整循环步长 等控制循环的代码. • 移动SD到SUBI和BNEZ后,需要调整SD中的 偏移