去除指令的相关性

指令的相关性限制了指令的乱序调度并行调度,需要去除这些相关以达到较好的指令调度。

1. 去数据相关

数据相关在代码中肯定是 有的,如果每条语句都没有数据相关,那么它们就不能组合起来完成一项任务。不过数据相关虽然不能完全消除,但是可以适当减少,如这段代码:

x=a+b;
y=x+c;
z=y+d;

这3条指令都是相关的,如果改成这样

x = a+b;
y = c+d;
z = x+y;

第1条和第2条指令就不相关了。去数据相关不是处理器的工作,是程序员或编译器的工作。

2. 去控制相关

处理器预测出跳转指令的目标地址,假设按照这条路径开始执行,跳转后面的指令甚至可以提前跳转指令的前面去乱序执行,如果预测正确,那当然皆大欢喜,如果失败,就从头再来。

3. 去伪相关

伪相关定义:

处理器的ISA寄存器数目通常比较少,编译器在将程序中的变量映射到寄存器时,会导致多个变量对应同一个寄存器,这样即使不相关的指令,也会使用同样的寄存器,导致了名字相关,即伪相关

解决思路

将ISA寄存器重新映射到处理器内部的物理寄存器,由于物理寄存器较多,相同的ISA寄存器可以映射到不同的物理寄存器,经过映射后,行的指令就能使用不同的物理寄存器,指令间的相关性也就消除了。

 

在上图中,两条语句C = A+B和F=D+E本来是不相关的,但是由于ISA寄存器太少了,变量映射到同一个寄存器上,采用寄存器重命名,将ISA寄存器映射到新的物理寄存器上,这样新的指令就不再相关了。

4. 寄存器重命名

 寄存器不能随便更改名字,否则原来的数据依赖关系就被打乱,会导致错误的执行结果,那么怎样才能既保留原先的数据依赖关系,又能将没有数据依赖性的指令的寄存器改名字呢?

在处理器中经常实现的策略:

(1)将每条指令的目的寄存器映射到新的物理寄存器;

(2)指令的源寄存器映射为ISA寄存器最近映射到的那个物理寄存器;

(3)当本条指令完成后,该目的寄存器映射的更早的物理寄存器就可以释放了。

 

  • 上图中,指令的第一寄存器时目的寄存器,后两个是源寄存器,R1、R2、R3、R4是ISA寄存器,F1……F16是物理寄存器。
  • R1、R2、R3、R4一开始被映射到F1、F2、F3、F4,第1条指令的目的寄存器是R3,因此将R3重新映射到F5。
  • 第2条指令的源操作数需要访问R3,就使用R3的最新映射值——F5,这样就保证了指令2和指令1的数据相关性。
  • 指令3和指令2有反相关,将指令3的R2映射为F7,这样指令3和指令2就没有相关性了,即使指令3在指令2前面执行,也不会影响指令2的结果。
  • 指令4和指令3有输出相关,经过寄存器重命名后,指令4和指令3的R2分别对应不同的物理寄存器,它们之间的相关性就去除了。
  • 同样的原理,指令4和指令5的相关性被保留。
  • 如果按照这种方式映射下去,物理寄存器自然会被使用完。因此,需要实时的释放,已被重新分配。R4一开始映射到R4,当第2条指令执行完成后,R4的值就在F6中了,以后访问R4时,都会使用最新的F6,而不会使用F4,这样F4就可以被释放了。

这种策略中,指令完全不需要访问ISA寄存器,只需要访问物理寄存器。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

狮子座硅农(Leo ICer)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值