ILP——指令级并行1:软件方法

阅读: 评论:0

ILP——指令级并行1:软件方法

ILP——指令级并行1:软件方法

ILP——指令级并行1

软件方法的指令级并行

循环展开
  1. 基本块的定义

    直线型代码,无分支;单入口;程序由分支语句连接基本块构成

  2. 循环级并行

    第一个思路是调整循环中的指令顺序,以减少因为相关产生的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
    
  3. 循环展开的注意事项

    • 必须保证程序运行结果不变
    • 修改指令顺序后有些指令偏移量需要修改,如跳转等
    • 不同次的循环,需要使用不同的寄存器(寄存器重命名)
    • 对于LD/SD指令,还需要确定访问的内存位置是否相关

静态指令级调度:从编译器角度看代码移动,编译器在进行代码调动时候需要注意以下几点

  1. 寄存器相关——若有相关不能并行
  2. 存储器相关——若是访问寄存器中同一块地址的相关难以直接看出
  3. 控制相关——受分支指令控制的指令不能移到分支指令之前,不受分支指令控制的指令不能移到分支指令之后

本文发布于:2024-01-31 16:38:54,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170669033629909.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:指令   方法   软件   ILP
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23