第五章:乱序执行

本文介绍处理器乱序执行概念,即执行阶段乱序,取指和提交指令顺序执行。分析指令相关性,包括寄存器相关和控制相关,阐述去除相关性的寄存器重命名策略。还讲述乱序执行中Buffer的作用、指令调度及顺序提交,最后提及用C语言代码实现算法。

1.概念

        指令在执行时常常因为一些限制而等待。例如,MEM单元访问的数据不在cache中,需要从外部存储器中取,这个过程通常需要几十、几百个Cycle,如果是顺序执行的内核,后面的指令都要等待,而如果处理器足够智能,就可以先执行后面不依赖该数据的指令,这就是处理器的乱序执行。

        是在执行阶段乱序,而取指令和提交指令都是顺序的。

 2.指令相关性

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

2.1 寄存器相关

        当两条语句没有共用寄存器时,它们之间是不相关的,而当两条语句共用寄存器时,它们就有可能相关。

(1)先读后读

ADD BX, AX;将AX和BX相加,存放到BX中(前面的寄存器为目的寄存器)
ADD Cx, Ax;将AX和CX相加,存放到CX中

        没有相关性

(2)先写后读(RAW)

ADD Bx, AX;将Ax和 BX相加,存放到BX中
ADD cx, Bx;将BX和 CX相加,存放到CX中

        这两条指令都用到 BX,指令1输出 BX给指令2用,它们之间有数据流动,存在依赖性,因此也称为数据相关。

(3)先写后读(WAR)

ADD BX, Ax:将AX和BX相加,存放到BX中
MOV Ax, Cx;将Cx的值赋给AX


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

(4)先写后写

MOV Ax, BX;将BX的值赋给AX
MOV
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Strive_LiJiaLe

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

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

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

打赏作者

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

抵扣说明:

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

余额充值