现在的位置: 首页 > 综合 > 正文

《大话处理器》连载——微架构(18) 指令的顺序提交

2018年05月07日 ⁄ 综合 ⁄ 共 776字 ⁄ 字号 评论关闭

        在指令的执行过程中,通常会有中断和异常产生,例如在下面这个例子中, 

中断例子

         XOR指令执行完后,来了一个中断,中断处理一般都是将处理器的ISA寄存器压栈,执行中断服务程序,然后再退回来执行中断后面的指令。精确中断(Precise Interrupt)要求中断前的指令都执行,中断后的指令都没有执行,而在乱序执行内核中,MOV、INC指令有可能提前到XOR前面执行,那么怎么来实现精确中断呢?

       解决方法就是:在指令乱序执行之后,再加一个步骤:指令顺序提交(In-order commit)。乱序执行后,指令的结果虽然出来了,但是这个结果并没有立即提交到ISA寄存器中,而是先缓存起来,只有当前指令前面的指令提交后,这条指令才能提交。

        指令的顺序提交也能解决投机执行出错的问题。如下图所示:

投机执行的示意图

       分支预测单元预测到JNZ跳转到XOR处执行,乱序执行让XOR指令在ADD前面执行,不过天有不测风云,处理器执行到JNZ时,发现分支预测单元预测错了,实际上应该执行的是MOV这个分支,使用顺序提交策略,JNZ后面指令的结果都没有提交,可以直接抛弃,重新开始执行MOV这条路径即可。

        为了实现指令的顺序提交,处理器内部使用了一个Buffer,叫做重排序缓冲区(ROB,Re-order Buffer),多数的学术文章都叫这个名字,龙芯把这个buffer叫做Reorder Queue,简称ROQ(总要有所区别嘛)。

        每条完成寄存器重命名的指令都要送到ROB中,ROB中的指令按照初始顺序存放,指令经乱序执行后,只是修改了处理器内部的物理寄存器,并没有修改处理器的ISA寄存器(汇编指令能看到的寄存器),指令在提交时,按照ROB中的顺序,顺序的修改处理器的ISA寄存器。

 

 

抱歉!评论已关闭.