寄存器重命名
- 重命名映射表
-
- [基于 SRAM 的重命名映射表](#基于 SRAM 的重命名映射表)
- 超标量处理器的寄存器重命名
-
- [解决 RAW 相关性](#解决 RAW 相关性)
- [解决 WAW 相关性](#解决 WAW 相关性)
-
- [对写 RAT 进行检查(判断哪个 ARF 写入到 RAT)](#对写 RAT 进行检查(判断哪个 ARF 写入到 RAT))
- [对写 ROB 进行检查(判断)](#对写 ROB 进行检查(判断))
- 特殊指令处理方式
重命名映射表
重命名时
- 源寄存器查找 RAT 获得对应物理寄存器标号
- 指令的目的寄存器会新增对应新的物理寄存器
两种方式
- SRAM 方式
- SRAM 是每个逻辑寄存器分配一个物理寄存器
- Entry 项为 32 个,一共有 32 个逻辑寄存器
- SRAT 占据空间是 32 X 6 bits = 192 bits
- CAM 方式(Content Addressable Memory)
- CAM 是每个物理寄存器分配一个逻辑寄存器,所以需要 valid 位来表示
- Entry 项为 64 个,一共有 64 个物理寄存器
- CRAT 占用空间是 64 X 5 bits = 320 bits
- 需要 valid 位来表示
- 对比
- 都是使用逻辑寄存器来寻址
- SRAM 快,并且节省资源
- 对 cRAT 进行 Checkpoint 只需要保存状态位
32 个逻辑寄存器 5 位来表示
64 个物理寄存器 6 位来表示
#问题 CAM 的 check points 只需要一位?
在完成 RAT 写入时
对于一个特点的通用寄存器来说
- SRAM 中
- 需要保存当前值,当前值又因为 ARF 可能会不断映射新的值而被覆盖,所以需要保存所有
- CAM 中
- ARF 的内容不断写入,PRF 不断新增覆盖旧项,所以只需要指示 valid 即可
基于 SRAM 的重命名映射表
超标量处理器的寄存器重命名
Dest = Src1 op Src2
过程
- 从 RAT 里找到 Src1 和 Src2 的物理寄存器 Psrc1 和 Psrc2
- 从 free list 中找到一个空闲的物理寄存器 Pdest
- 将 Dest 和 Pdest 的映射关系写到 RAT 中,之后可以用 Dest 去索引映射关系
一条指令重命名,RAT 一共需要 3 读 1 写端口
- 3 读
- 2 个 Src1 和 Src2
- 1 个 Dest 读取之前的映射
- 1 写
- 给 Dest 写入新的映射
4-way 指令则是 12 读,4 写
重命名可以解决 WAR 和 WAW 问题
为什么重命名还需要 RAW 和 WAW 相关检查
- 指令 A 和 B 之间 RAW 相关
- R0 需要查询指令 A 的结果,而不是 RAT 的结果
- 指令 A、B、D 之间 WAW 相关
- 写入 RAT 时,一个周期多条指令有相同目的寄存器,则将最新的映射写到 RAT 中即可
- 而检查旧映射时,也应该使用有 WAW 相关性的指令,而不是 RAT 读取的值
- 指令 B 和 D 之间的 WAR 相关
- 对重命名没有影响
主要延迟的来源:
- 多端口 SRAM 本身延迟
- RAW 和 WAW 相关性检查的延迟
在不出现 RAW 和 WAW 相关下的映射
解决 RAW 相关性
#问题 R1 映射出来结果应该一致,为什么会不一致?
检查方式:
- 每条指令的 Src 和之前的 Dst 编号进行比较,如过相等,则用 free list 取出来的值,如果有多个相等,则取出最新的指令对应的物理寄存器
解决 WAW 相关性
对写 RAT 进行检查(判断哪个 ARF 写入到 RAT)
只有最新的指令 D 才能写到 RAT,对周期内进行寄存器重命名的所有 WAW
写之前完成检查
对写 ROB 进行检查(判断)
为了释放不再使用的物理寄存器,需要从 RAT 读出以前对应的物理寄存器,并且写到 ROB 当中,告诉 ROB 我的值是在哪里,而不是让 ROB 去检查 ART 查到错误的值
如果寄存器地址,同时读写操作,先读后写
- 读优先则能满足需求
FPGA 的两种特性
写优先
- 写入的内容可以马上读取到
读优先
- 写入的内容需要在下个周期读取
特殊指令处理方式
- 根据当前目的寄存器的个数,决定当前周期从 free list 中读取的数值的个数
- 使用目的寄存器读取 RAT 时,根据标记,明确哪些会读哪些不会读
- 使用源寄存器读取 RAT 时,通用
- RAW 和 WAW 检查时自动忽略比较的结果