首页 > 编程知识 正文

变频器启动报ilp故障,ilp模型

时间:2023-05-04 23:04:22 阅读:228129 作者:560

ILP——指令级并行1 软件方法的指令级并行 循环展开

基本块的定义

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

循环级并行

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

循环展开的注意事项

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

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

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

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。