您的位置:首页 > 运维架构 > 网站架构

《大话处理器》连载——微架构(17) 指令调度

2011-08-23 21:00 211 查看
在前面乱序设置陷阱的利子中,如果没有那个聪明的士兵,乱序也就无从谈起。同样,处理器的乱序执行内核也需要一个调度器,分析指令间中的相关性,分析指令什么时候能开始执行。

指令什么时候能开始执行呢?

对于一条指令来说,它有操作码和操作数,操作码描述指令要做什么,处理器会安排一个功能单元(function unit)去执行它。操作数描述指令要处理什么数据,经过寄存器重命名后,目的寄存器总是新的,因此只需要关注源操作数是否准备好即可。所以,指令能否开始执行,依赖于2个条件:

1. 是否有空闲的功能单元去执行这条指令

2. 该指令的源操作数是否已经准备好

只要满足这2条要求,指令就可以去执行,而不需要等待前面的指令完成。这样处理器就完成了乱序调度以及并行调度。

以前面经过寄存器重命名的指令为例,

序号
指令
源操作数依赖性描述
执行顺序
1
add F5, F1, F2
假设F1、F2已准备好
1
2
add F6, F5, F2
F5需要依赖指令1
2
3
add F7, F1, F5
F5需要依赖指令1
2
4
add F8, F1, F6
F6需要依赖指令2
3
5
add F9, F8, F5
F5需要依赖指令1
F8需要依赖指令4
4
处理器会记录指令源操作数的准备状态,当指令1完成后,处理器会通知所有依赖F5的指令,F5已经准备好了,指令2需要的2个源操作数F5和F2都已准备好,它就可以被发送到指令的执行队列中去执行。同样,指令3也可以准备执行,如果处理器中有多个加法单元,指令2和指令3就可以同时执行。指令2完成后,F6也准备好了,指令4就可以去执行,指令4执行完后,F8就准备好了,F5早就准备好了,指令5就可以去执行。

在这个调度的例子中,5条指令4个cycle就可以完成,而使用顺序内核,则需要5个cycle。

处理器内部需要一个Buffer来缓存指令,以供乱序调度,这个Buffer就是保留站(Reservation Station),完成寄存器重命名后的指令被放置在保留站中,等到操作数和功能单元都准备好时,保留站中的指令就能被分派出去执行。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: