指令动态调度

一、乱序执行的基本思想

无论是流水线停顿,还是增加旁路,只要前面指令的特定阶段还没有执行完成,后面的指令就会被“阻塞”住,流水线停顿的时候,对应的电路闲着也是闲着。那我们完全可以先完成后面指令的执行阶段。因为尽管代码生成的指令是顺序的,但是如果后面的指令不需要依赖前面指令的执行结果,完全可以不必等待前面的指令运算完成

a = b + c
d = a * e
x = y * z

计算里面的 x ,却要等待 a 和 d 都计算完成,实在没啥必要。所以我们完全可以在 d 的计算等待 a 的计算的过程中,先把 x 的结果给算出来,所以,在流水线里,后面的指令不依赖前面的指令,那就不用等待前面的指令执行,它完全可以先执行

完整的顺序发射、乱序执行、顺序提交的流程图

  1. 在取指令和指令译码的时候,乱序执行的 CPU 和其他使用流水线架构的 CPU 是一样的。它会一级一级顺序地进行取指令和指令译码的工作
  2. 在指令译码完成之后,就不一样了。CPU 不会直接进行指令执行,而是进行一次指令分发,把指令发到一个叫作保留站(Reservation Stations)的地方,并且预约再定序缓冲器(相当于提前完成写结果的操作)
  3. 这些指令不会立刻执行,而要等待它们所依赖的数据,传递给它们之后才会执行
  4. 一旦指令依赖的数据来齐了,指令就可以交到后面的功能单元(Function Unit,FU),其实就是 ALU,去执行了。我们有很多功能单元可以并行运行,但是不同的功能单元能够支持执行的指令并不相同
  5. 指令执行的阶段完成之后,我们并不能立刻把结果写回到寄存器里面去,而是把结果再存放到先前预约的再定序缓冲器中
  6. 重排序缓冲区里,我们的 CPU 会按照取指令的顺序提交指令,按顺序真正的写入寄存器或存储器中

超标量和流水技术是实现乱序的前提

静态调度(在程序编译期间进行)

  • 通过编译器把相关的指令拉开距离,将其他不相关的指令插入两个依赖指令之间来减少停顿

动态调度(在程序执行期间进行)

  • 通过硬件对指令执行的乱序来减少停顿

二、记分牌算法

记分牌技术没有消除相关,只是通过将相关的后一条指令暂停来避免发生冲突

将流水线中的译码段ID细分为IS(Issue)和RO(Read Operands)

1.Issue

如果指令对应的功能部件不忙(避免结构冲突),且没有其他活跃的指令使用相同的目的寄存器(避免写后写冲突),记分板向功能单元发射指令,并且更新内部的数据结构

2.Read Operands

如果没有早先被发射的活跃指令写该寄存器(没有写后读),或者寄存器中包含的操作数已经被当前活跃的功能单元写入,则源操作数可用。如果不可用,则等待。当源操作数可用,记分板通知功能单元处理从寄存器中读取操作数并开始执行。在这一步骤中避免了RAW冲突,且指令被乱序执行

3.Execution

功能单元收到完备的操作数时就开始执行。当结果准备好,则通知记分板执行已经完成

4.Write Result

一旦记分板知道功能单元已经执行完毕,检查WAR,如果没有,写结果(避免读后写冲突)。如果有,则等待

三、Tomasulo算法

Tomasulo结构引入了保留站(reservation station)这一概念,实际上就是一组新增的具有唯一标识的寄存器,通过使用保留站进行寄存器换名,真正意义上消除了写后写冲突和读后写冲突

此外,还引入了公共数据总线(CDB),所有功能部件的计算结果都是送到CDB上,由它把这些结果直接送到各个需要该结果的地方。虽然没有消除写后读,但已经最大限度地减少了写后读冲突的影响

1.Issue

如果保留站空闲(无结构冲突),就发射指令

如果操作数在寄存器中已就绪,就直接送往保留站;如果还没有,就把产生该操作数的保留站的标识送往保留站(对寄存器进行换名,消除了读后写)

最后,还要完成对寄存器的预约工作,将寄存器状态表的相应项设置为源保留站的标识,这相当于提前完成了写操作。由于指令是按顺序流出的,所以当多条指令写同一个结果寄存器时,最后留下的预约结果肯定是最后一条指令的。这样一来,就消除了写后写冲突

2.Execution

如果两个操作数都已就绪,就执行;如果没有就绪,就观测公共数据总线等待所需结果。

保留站有可能出现多条指令在同一时钟周期变成就绪的情况。不同功能部件可以并行执行,但在一个功能部件内部,就绪的多条指令则需逐条处理,可以采用随机的方法选择一条要执行的指令

3.Write result

通过公共数据总线将结果写入到所有等待的部件,置保留站为空闲状态

其实,该算法对指令的执行有限制,即如果流水线中还有分支指令没有执行,那么当前指令就不能进入执行状态。这是因为在流出阶段后,程序顺序就不再被保证了,所以为了保证正确的异常行为,必须加上这个限制。不过,前瞻执行可以消除这个限制

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值