参考自:计算机体系结构-寄存器重命名 - 知乎 (zhihu.com)
这里的重点在红色部分描述上,也是容易想不通的地方;
在SRAM方法中要恢复映射表状态,需要事先把分支指令来临时刻的映射表全份拷贝下来,然后在恢复时把备份复制回映射表,这使得在checkpoint数量增加的时候备份消耗的资源线性增加。
而在CAM方法中要恢复映射表关系,只需要保存分支指令来临时刻映射表的有效位状态,然后在恢复的时候把有效位置回,这使得在CAM方法中增加checkpoint数量是一件不费力的事情,alpha21264通过CAM方法实现了80个checkpoint,这在SRAM方法中是不可想象的。
为什么CAM只需要保存有效位信息?假想以下指令序列:
上面的汇编程序在基于CAM的映射表进行重命名时,执行过程是这样的:
(1)分支指令F在重命名时,需要进行checkpoint保存机器状态,此时映射表的内容如下图所示:
其中B、D的V显示1->0,在实际实现中这两位肯定是0,这里写1->0是想说明这两条指令还没有提交(这个信息体现在ROB和空闲寄存器列表中,这里没有显示,所以写0->1),因此P11、P13这两个对应的物理寄存器尚处在不能解放的状态,即P11、P13的映射关系不能被改写。
(2)在G、H指令重命名之后,机器发现分支预测错误,需要恢复机器状态,在恢复状态之前,映射表的内如如下:
(3)在恢复映射表时,机器会将上图中的GC0复制到映射表的有效位V中,这样就可以恢复到分支指令F刚进入重命名阶段时的状态。
值得注意的是,此时P11、P13和(1)中一样是0,但是含义已经不一样。(1)中虽然V=0,但是BD指令没有提交,所以这两个物理寄存器不能释放,即没有进入空闲列表;但是在(3)中BD指令已经提交(假设机器的顺序提交的机器,那么当发现F指令预测错误且要处理错误信息时,BD大概率已经被提交掉),所以P11、P13已经是释放状态,可以被其他的逻辑寄存器占用。虽然这两个0含义不一样,但是不会导致程序出错。
这里可能有人会有疑虑,可能会假想这么一种情况:F指令之后的指令修改了P14的映射关系,而只恢复V不能置回P14的信息。实际上这是不可能的,时刻记得机器是一个顺序提交的机器,在分支指令F提交时,E指令之后的一切指令都没有提交,所以P14的有效位虽然可能被改写为0,但是它不会进入空闲列表(因为,一个寄存器的释放,是靠下一次使用到这个寄存器的指令commit时,根据last reg来释放的,下一个使用这个寄存器的指令还在分支指令之后,不可能提交,自然也不可能释放掉,所以这个P14的映射关系也不可能被改写),所以P14的映射关系不会被改写。
总结一下,CAM方法用checkpoint恢复机器状态时只需要恢复有效位V,而不需要恢复其他内容,SRAM方法则需要复制整个SRAM,这导致虽然SRAM方法在查询映射表时即快速又节约资源(SRAM行数等于逻辑寄存器个数,而CAM行数等于物理寄存器个数),但是在处理分支错误的时候慢于CAM方法,且上限也远低于CAM方法(能容纳的checkpoint少于CAM方法)。在实现映射表时选用哪种方法是一件值得设计人员权衡的事情。