结果分析 ◆这个循环每遍共使用了28个时钟周期 ◆有4个循环体,完成4个元素的操作 平均每个元素使用28/4=7个时钟周期 ◆原始循环的每个元素需要10个时钟周期 节省的时间:从减少循环控制的开销中获得的 ◆在整个展开后的循环中,实际指令只有14条, 其它13个周期都是空转。 效率并不高
26 结果分析: 这个循环每遍共使用了28个时钟周期 有4个循环体,完成4个元素的操作 平均每个元素使用28/4=7个时钟周期 原始循环的每个元素需要10个时钟周期 节省的时间:从减少循环控制的开销中获得的 在整个展开后的循环中,实际指令只有14条, 其它13个周期都是空转。 效率并不高
(2)对指令序列进行优化调度 指令流出时钟 Loop LDF0,0(R1) LD F6,-8(R1) LD F10-16(R1) LD F14,24(Rl) ADDD F4FO F2 ADDd F8.F6 F2 ADDD F12F10F2 ADDD F16F14.F2 SD 0(R1),F4 SD 8(R1),F8 SUBI R1R1,#32 234567890213 SD 16(R1),F12 BNEZ Rl,, Loop SD 8(R1)F16
27 (2) 对指令序列进行优化调度 指令流出时钟 Loop: LD F0,0(R1) 1 LD F6,-8(R1) 2 LD F10,-16(R1) 3 LD F14,-24(R1) 4 ADDD F4,F0,F2 5 ADDD F8,F6,F2 6 ADDD F12,F10,F2 7 ADDD F16,F14,F2 8 SD 0(R1),F4 9 SD -8(R1),F8 10 SUBI R1,R1,#32 12 SD 16(R1),F12 11 BNEZ R1,Loop 13 SD 8(R1),F16 14
结果分析: ◆没有数据相关引起的空转等待 ◆整个循环仅仅使用了14个时钟周期 平均每个元素的操作使用14/4-3.5个时钟周期 ●循环展开和指令调度可以有效地提高循环级并 行性。 ◆这种循环级并行性的提高实际是通过实现指令级 并行来达到的。 ◆可以使用编译器来完成,也可以通过硬件来 完成
28 结果分析: 没有数据相关引起的空转等待 整个循环仅仅使用了14个时钟周期 • 平均每个元素的操作使用14/4=3.5个时钟周期 • 循环展开和指令调度可以有效地提高循环级并 行性。 这种循环级并行性的提高实际是通过实现指令级 并行来达到的。 可以使用编译器来完成,也可以通过硬件来 完成
循环展开和指令调度时要注意的问题 (1)保证正确性 (2)注意有效性 (3)使用不同的寄存器 (4)尽可能减少循环控制中的测试指令和分支指令 (5)注意对存储器数据的相关性分析 (6)注意新的相关性
29 循环展开和指令调度时要注意的问题 (1) 保证正确性 (2) 注意有效性 (3) 使用不同的寄存器 (4) 尽可能减少循环控制中的测试指令和分支指令 (5) 注意对存储器数据的相关性分析 (6) 注意新的相关性
3.全局指令调度 全局指令调度实在保证不违背数据相关和控制相关的情 况下,吧代码尽可能压缩成几条指令。 循环分支指令引起的控制相关可以通过展开解决。 全局指令调度可以解决另一类由条件分支引起的控 制相关。 由于跨越分支移动代码经常会改变这些指令的执行 频率,所以全局指令调度的有效性依赖于对不同路径 上指令执行频率的估计 全局指令调度并不保证能提高执行速度,但如果预 测信息准确,编译器就可以进一步决定上述移动会不 会提高运行速度
30 3.全局指令调度 全局指令调度实在保证不违背数据相关和控制相关的情 况下,吧代码尽可能压缩成几条指令。 循环分支指令引起的控制相关可以通过展开解决。 全局指令调度可以解决另一类由条件分支引起的控 制相关。 由于跨越分支移动代码经常会改变这些指令的执行 频率,所以全局指令调度的有效性依赖于对不同路径 上指令执行频率的估计。 全局指令调度并不保证能提高执行速度,但如果预 测信息准确,编译器就可以进一步决定上述移动会不 会提高运行速度