流水线的控制相关和冲突
实验原理
控制相关引发流水线冲突的场景
转移类指令会引起流水线控制冲突。来看这样一个指令序列:
I1: addi x18,x0,1 I2: addi x19,x0,5 I3: addi x20,x0,1 I4: add x18,x18,x20 I5: bne x18,x19,-4 I6: addi x21,x0,6
上述指令序列实现的效果如下:首先将寄存器x18的值赋1,寄存器x19的值赋5,当寄存器x18和寄存器x19的值不相等时,跳转到指令I4,即寄存器x18中的数据加1,直至寄存器x18和寄存器x19中的值相等时,跳出循环,执行指令I6。
假设分支指令I5处于执行阶段时才能决定是否转移,当该指令第一次运行到执行阶段,此时比较寄存器x18和寄存器x19的值不相等并给出bne指令正确的跳转地址,应该在下一个时钟周期跳转到指令I4。但是实际上,分支指令I5后面的指令I6已经进入流水线。具体来说,当指令I5处于流水线中的译码阶段时(此时尚未计算出下一条指令的地址),在取指阶段PC已经完成了更新并取指,取出的指令为I6。如果不进行干预,指令I6会在分支指令跳转到I4指令之前就开始执行。换句话说,当前取出的指令与实际要跳转的指令不一致,即取回了错误的指令,这就产生了控制冲突。
解决控制冲突的方案
解决控制冲突最直接的办法就是识别出转移指令后立即阻塞流水线直到计算出转移地址,即停顿法。但是如果只是通过阻塞流水线的方式来避免控制相关引起的冲突,将会极大地降低流水线性能。
预测是一种提高性能的思想,假设从预测错误中恢复的代价并不高,并且预测相对准确,那么进行预测并开始工作可能会比等到明确结果后再执行更快。分支预测是一种解决控制冲突的方法,它预测分支的结果并沿预测方向执行,而不是等分支结果确定后。如果预测正确,这个方法不会减慢流水线。
假设分支不发生,是一种简单的分支预测方法,预测分支不发生并始终执行顺序指令流;一旦分支发生,已经被读取和译码的指令就将被丢弃,即预测错误时清空前两级流水线寄存器。这种静态分支预测机制依赖于始终不变的行为,存在预测错误代价大和性能浪费问题。
现代处理器普遍采用动态分支预测机制来解决转移指令引起的流水线阻塞,其基本思路是在取指令阶段使用历史运行信息进行分支预测,预测出转移指令所要跳转的目标地址后,从预测的目标地址继续取指令执行,这样在预测正确的情况下就不用阻塞流水线,预测错误才阻塞流水线,从而提高处理器的运行效率。
实验任务
2. 在实验平台验证
虚拟面板可在上一个实验解决流水线数据冲突的基础上修改。
编写测试程序,在实验平台调试验证自己的设计。测试程序应包含分支指令和无条件转移指令,应能反映预测的情况,以及间接转移的情况,可参考教学视频的讲解。