基本块的定义
直线型代码,无分支;单入口;程序由分支语句连接基本块构成
循环级并行
第一个思路是调整循环中的指令顺序,以减少因为相关产生的stall数
实例如下:
Loop: LD F0,0(R1) ;F0=vector elementADDD F4,F0,F2 ;add scalar from F2SD 0(R1),F4 ;store resultSUBI R1,R1,8 ;decrement pointer 8B (DW)BNEZ R1,Loop ;branch R1!=zeroNOP ;delayed branch slot
上述指令中可以看出如果不调整顺序,加入stall后如下
Loop: LD F0,0(R1) ;F0=vector elementstallADDD F4,F0,F2 ;add scalar in F2stallstallSD 0(R1),F4 ;store resultSUBI R1,R1,8 ;decrement pointer 8B (DW)stall ;BNEZ R1,Loop ;branch R1!=zerostall ;delayed branch slot
通过调整循环内指令顺序,将没有数据相关的指令放在一起以减少stall
Loop: LD F0,0(R1)SUBI R1,R1,8ADDD F4,F0,F2stallBNEZ R1,Loop ;delayed branchSD 8(R1),F4 ;altered when move past SUBI
进一步优化的思想是将循环展开,每4个循环展开成一个循环,然后调整指令顺序以使得stall进一步减少
Loop: LD F0,0(R1)LD F6,-8(R1)LD F10,-16(R1)LD F14,-24(R1)ADDD F4,F0,F2ADDD F8,F6,F2ADDD F12,F10,F2ADDD F16,F14,F2SD 0(R1),F4SD -8(R1),F8SUBI R1,R1,#32SD 16(R1),F12BNEZ R1,LOOPSD 8(R1),F16
循环展开的注意事项
静态指令级调度:从编译器角度看代码移动,编译器在进行代码调动时候需要注意以下几点
本文发布于:2024-01-31 16:38:54,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170669033629909.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |