(1)动态调度的主要作用及其思想:
有序进入、乱序执行、有序结束
- 把读寄存器从译码中区分开来,并利用保留站等指令缓存技术避免前面的阻塞的指令影响后面指令的执行;
- 通过ROB对执行完的指令重新排序实现有序结束;
- 利用寄存器重命名技术保存未提交的临时结果,消除WAW和WAR相关并支持猜测性执行;
(2)影响动态调度的主要因素:
①指令缓存的结构:
• 独立保留站
• 组保留站
• 全局保留站
②读取寄存器内容的时间:
• 保留站前读
• 保留站后读
③寄存器重命名的方法:
• 重命名寄存器和物理寄存器分开
• 重命名寄存器和物理寄存器合并
比较:数据通路复杂度(结果总线传送)、保留站项数、保留站效率、发射复杂度
(1)独立保留站:每个功能部件一个保留站
> 每个保留站项数较少(2-4项),只要一个写入端口一个读出端口,输出选择比较简单;
> 保留站利用率低,可能忙的忙死甚至引起堵塞,闲的闲死;
> 结果总线送到所有保留站,连线长,结果写回可能需要单独一拍;
- CDC6600每个EU一项保留站;
- IBM360/91中浮点加减部件两项,浮点乘法部件3项保留站;
- PowerPC 620三个定点一个浮点部件每个两项保留站;
- 龙芯1号三个定点两个浮点部件每个两项保留站;
(2)分组保留站:同组的功能部件共享保留站
> 每个保留站项数较多,每个保留站需要多个写入端口多个读出口,保留站读出可能需要单独一拍;
> 保留站效率较高;
> 结果总线不用送到每个功能部件;
- 一般划分时考虑定点、浮点、访存;
- R10000定点、浮点、访存各16项 • Alpha 21264定点20项、浮点15项
- PA8700运算和访存各28项,还起到ROB作用
- Godson-2采用组保留站
(3)全局保留站:所有功能部件共享保留站
> 保留站项数很多,读出写入端口都很多,保留站读出时间长,保留站控制很复杂
> 保留站效率很高
> 结果总线只送到全局保留站
- Pentium Pro的全局保留站有20项
(1)保留站前读寄存器:寄存器的输出作为保留站的输入
• 操作数没准备好就读寄存器,保留站侦听结果总线获取没写回的值
• 有序发射:有序读寄存器
• 保留站中值的来源:寄存器、重命名寄存器、进入保留站时侦听、进入保留站后侦听
• 保留站中有值域,较复杂
• 寄存器读端口数为发射宽度
(2)保留站后读寄存器:保留站的输出作为寄存器的输入
• 保留站确信所有值都已经准备好后再读寄存器,有可能有Forward的情况
• 乱序发射:乱序读寄存器
• 保留站中无值域,较简单
• 寄存器读端口数为相应功能部件数
(3)保留站前(后)读寄存器的处理器比较:
似乎保留站后读寄存器占了上风
(1)双重作用:
• 例外或转移猜测错误时取消后面操作
• 解决WAR和WAW相关
(2)核心思想:
• 一个操作写寄存器时重命名到其他寄存器
• 一个操作结束时再写到结构寄存器
(3)重命名方法多种多样,不拘一格—总之只要找到一个地方临时放一下数据
① 软件寄存器重命名:
② 重命名到保留站:
③ 重命名到ROB:
④ 重命名到发射队列:
⑤建立逻辑寄存器到物理寄存器的映射:
(1)重命名寄存器和结构寄存器分开:
• 重命名到保留站、ROB、专门的重命名寄存器、发射队列
(2)重命名寄存器和结构寄存器不分开:
• 为每个逻辑寄存器动态分配物理寄存器,需要建立逻辑寄存器和物理寄存器之间的映射表。
• 映射表可以是RAM(多逻辑 → 单物理)的方式,即有逻辑寄存器那么多项,也可以是CAM(单逻辑→多物理)的方式,即有物理寄存器那么多项。
(1)独立重命名寄存器的重命名算法:
1)描述:假设保留站前读寄存器
译码阶段
- 为目标寄存器分配一个空闲的重命名寄存器
- 为源寄存器找到相应的重命名或结构寄存器号
- 读操作数(注意三种操作数来源)并送入保留站
发射阶段
- 在保留站中找操作数准备好的操作进行运算,不涉及重命名
执行阶段
- 执行结果写回到重命名寄存器
- 写回到侦听该重命名寄存器值的保留站
- 不写回结构寄存器
提交阶段
- 把重命名寄存器的值写回到相应的结构寄存器
- 释放相应的重命名寄存器
转移猜错或例外
- 取消后面的已经建立的重命名关系
- 把结构寄存器的状态都置为有效
- 把重命名寄存器的状态都置为空
重命名寄存器的状态
- EMPTY:表示该寄存器没有被重命名(重命名后又已经被释放)
- MAPPED:表示已经被重命名但结果没有写回
- WRITEBACK:表示结果已经写回重命名寄存器但没有Commit到结构寄存器
结构寄存器的状态
- VALID:表示相应寄存器的值可用
- INVALID:表示相应寄存器的值不可用
映射关系
- 可在结构寄存器中增加一个指向重命名寄存器的重命名寄存器号域
(2)使用物理寄存器堆的重命名算法:
1)描述:假设保留站后读寄存器
译码阶段
- 把目标寄存器映射到一个空闲的物理寄存器
- 为源寄存器根据依赖关系找到相应的物理寄存器号
- 把重命名后的寄存器号写入保留站
发射阶段
- 判断所需的操作数是否已经准备好,或(Forwarding情况下)正在写回
- 从物理寄存器或结果总线中读寄存器的值
执行阶段
- 执行结果根据目标物理寄存器号写回到物理寄存器
- 不用写回到保留站
提交阶段
- 修改重命名表确认目标寄存器的重命名关系
- 释放老的目标寄存器重命名关系
转移猜错或例外
- 修改重命名表取消后面的已经建立的重命名关系
- 把状态为MAPPED或WRITEBACK的都置为EMPTY
- 确认状态为COMMIT的映射为相应逻辑寄存器的最新映射
-
2)核心是重命名表
- 可以用CAM或RAM的方法,以CAM的方法为例
- 项数与物理寄存器一样
-
3)主要包括三个域
name:相应的逻辑寄存器号
state:状态,
- EMPTY:表示该寄存器没有被重命名(重命名后又已经被释放);
- MAPPED:表示已经被重命名但结果没有写回;
- WRITEBACK:表示结果已经写回重命名寄存器但没有Commit到结构寄存器;
- COMMIT:表示结果已经被确认
valid:在一个逻辑寄存器对应多个物理寄存器的情况下表示最新映射
(3)不同处理器的重命名方法:
UltraSparc没有使用寄存器重命名
(1)三方面考虑:
• 保留站结构(独立、分组、全局)
• 读操作数时机(译码:先读寄存器再保留站、发射: 先保留站再寄存器)
• 重命名方式(重命名寄存器与结构寄存器分开、不分开)
(2)因此一共有12种组合;
(1)数据通路变宽:
• Alpha21264:取指4条,发射6条,写回6条,Commit 11条
• 寄存器读端口变多
• 访存端口要求也增加,如Alpha有两个访存部件,通过倍频实现
(2)同一拍发射的指令之间的相关:
• 如在重命名阶段发生同一拍之间的相关
(3)流水线复杂度与发射宽度成平方关系:
• 如发射队列(保留站)变大*(读端口变多+侦听端口变多)
• 如寄存器重命名端口变多*同一拍重命名指令相关
假设开始时与逻辑寄存器R1,R2,R3对应的最近的物理寄存器分别为PR1,PR2,PR3, 在同一拍中对如下指令进行寄存器重命名:
(1)同时提交多条指令:
• 重命名把有序变成无序,要除了“前后看”,还要“左右看”;
• 提交把无序变成有序,也要“左右看”:同一拍可以提交多条,第二条是否提交要看第一条是否提交等;
(2)指令发射和读寄存器:
• 多端口寄存器是物理设计的难点:会增加延迟、面积、功耗,四发射结构一般至少需要四写八读的寄存器堆;
• 指令发射逻辑:从保留站中同时找出多条数据准备好的指令,为了性能要适当考虑在数据准备好的情况下前面的指令先发射;
(3)多功能部件:
• 增加回端口:寄存器堆、重命名寄存器表、ROB、发射队列
• 尤其是多访存部件会大大增加设计复杂度
重命名逻辑随发射宽度的平方复杂度!