指令相关

相关是影响乱序调度的罪魁祸首,如果指令2的执行需要依赖指令1的结果,我们就
说这两条指令是相关的,指令2必须在指令1后面执行,无法乱序。
下图描述了指令间的相关性:
811006-20180617222916404-1940677968.png

1.寄存器相关

当两条语句没有共用寄存器时,它们之间是不相关的,而当两条语句共用寄存器时,它们就有可能相关。
我们以x86汇编来看看指令间的相关性。

(1) 先读后读
811006-20180617222945970-658108706.png

这两条指令实际上是没有相关性的,调转一下执行顺序,对结果没有影响。

(2) 先写后读(Read-Afer- Write,RAW)
这两条指令都用到BX,指令1输出BX给指令2用,它们之间有数据流动,存在依赖性,因此也称为数据相关。

811006-20180617223142874-1208009594.png

(3) 先读后写( Write -After- Read,WAR)
811006-20180617223525232-1321041411.png

这两条指令都用到AX,指令1读AX,指令2写AX,如果直接将两条语句调转,执行结果自然是不一样的,因此它们具有相关性。不过如果仔细分析一下,这两条语句之间并没有数据流向,在逻辑上并没有相关性,引起它们相关性的原因在于:x86处理器对程序员可见的通用寄存器太少了,指令不得不共用寄存器,这样才导致指令间存在相关。WAR和RAW相反,因此这种相关也称为反相关( Anti Dependencies)。

(4) 先写后写( Write- After- Write,WAW)
811006-20180617224109445-1184634548.png
这两条指令都向AX中写,和wAR一样,wAW的两条指令间也没有数据流动,它们的相关是因为有相同的输出寄存器,因此被称为输出相关( Output Dependencies)。WAR和wAW没有逻辑上的相关性,只是由于共用了同一个寄存器而存在相关性,它们被称为伪相关( False Dependencies)或者名字相关( Name Dependencies)

2. 控制相关

程序中有许多条件跳转,如下面这个例子:

mov
cmp
JNZ label
ADD
....
label: XOR

JNZ是个条件跳转语句,XOR指令的执行需要依赖于JNZ的结果,这种相关性是由指令的控制流决定的,因此被称为控制相关。

转载于:https://www.cnblogs.com/linhaostudy/p/9193929.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值