现代处理器设计——超标量处理器基础(5-8)
重命名中出现的影子寄存器(shadow registers)具有专有用处,例如作为计数寄存器,链接寄存器的重命名等。
分派阶段停顿的产生原因:寄存器读端口饱和,保留站饱和,重命名缓冲饱和,完成缓冲饱和,多于一条指令分派到同一单元(保留站只有一个写端口),串行化限制
串行化限制:某些指令要求之前的指令必须在该指令执行之前完成分派/执行,之后的指令必须在该指令执行结束之后才能够分派/执行
MSHR(the miss status holding register):保存cache失效后要处理的操作,直到cache miss处理完成。
对于分支预测器,16K的一位项的性能要好于8K的两位项
ROB必须要检查给定的IA32指令的边界,确定它们是否严格地遵守原子性规则。(某些微操作被标记为第一个微操作或者是最后一个微操作)
当对组成IA32指令的一系列微操作进行提交时,不能处理外部的事件,所有外部事件必须等待。当时在两个IA32指令之间,处理器必须能够捕获中断,断点,自陷和处理错误等。
IA32体系结构允许对通用整数寄存器(EAX,AX,AH)进行部分的读取和写入,因此在寄存器重命名实现上就会产生问题。当部分宽度的写操作后面跟有一个更长宽度的读操作时,更长宽度的读操作所需要的数据必须额能够得到前面多个写操作针对寄存器不同部分的更新。
- 解决:P6的解决方法是由RAT记录整数数组的每一项(对应一个微操作的目的寄存器)所使用的寄存器宽度,为数组的每一项增加一个2位的宽度域,以区分三种宽度的寄存器写操作。RAT使用寄存器的宽度信息来决定当前的读操作是否需要一个比前面写入的值更“宽”的寄存器值。如果需要,RAT必须生成一个部分写停顿。
- 8位寄存器的独立使用。如果对一个整数寄存器的三种宽度的访问都采用同一个别名,那么会导致大量的假相关出现。使用Low Bank和High Bank,高位字节或低位字节寄存器使用的是不同的重命名表项,两者相互独立的重新命名
由于RS是乱序分派微操作,其空闲表项典型的分布方式是分散在已经使用或者已经分配的表项之间,所以不能使用正常的循环缓冲模型,取而代之的是一种位图方法,每一个RS表项对应着RS分配池中的一位数据。通过这种方法,这些表项可以在分配池中以任何顺序被移动或者替代。RS的搜索方式是从地址0开始扫描,直到发现空闲表项为止。
超标量发展时间表