MIPS的指令可以分成如下5个阶段:
取指(Fetch)::从存储器取指令,并更新PC
译码(Decode):指令译码,从寄存器堆读出寄存器的值
执行(Execute):运算指令:进行算术逻辑运算,访存指令:计算存储器的地址
访存(Memory):Load指令:从存储器读指令,Store指令:将数据写入寄存器
回写(Write Back):将数据写入寄存器堆
单周期与流水线的区别
流水线并不会缩短单条指令的执行时间(甚至会增加时间),
而是提高指令的吞吐率(单位时间进多少指令,有多少指令完成)。
同一cycle发射多条指令
流水线寄存器:保存了前一个阶段要向后一个阶段传递的所有信息。
在两个阶段之间添加流水线寄存器后,此时5个阶段所作的工作还要与流水线寄存器联系起来
取指令(IF):利用PC中的地址从存储器中读取指令,然后将指令放入IF/ID流水线寄存器中
指令译码和寄存器堆的读取(ID):IF/ID流水线寄存器中的指令包括用于读取寄存器的两个寄存器号和用于符号扩展的16位立即数。读出的两个寄存器值和符号扩展后的32位立即数都存放在ID/EX流水线寄存器中
指令执行或地址计算(EX):指令执行或地址计算,并将结果存放在EX/MEM流水线寄存器中
存储器访问(MEM):根据EX/MEM中的有效地址读取数据。值得注意的是,需要写入寄存器的数据在较早的流水级中已经读取并存放在ID/EX中。在MEM级获得这个数据的唯一方法是把数据放入EX步骤中的EX/MEM流水线寄存器中,这一过程与将有效地址放入EX/MEM流水线中类似
写回(WB):在寄存器堆写信号有效时,将数据写入目的寄存器。sw指令在回写步骤不用做任何事
流水线的优化
超级流水线”技术:将五级流水线细分为更多的阶段,增加流水线的深度。
这样缩短了周期,从而提升了时钟频率,从而提高了指令吞吐率。
流水线的级数
流水线的级数是越大越好吗?肯定不是。级数越大,所用的流水线寄存器相应增加,单条指令的延迟增加,流水线寄存器延迟比例增加;填满流水线的指令条数更多,指令之间的关系更加复杂。
超标量流水线
超标量结构
超标量结构:通常,将具有两条或两条以上的并行工作的流水线结构称为超标量结构,亦称为“超标量流水线”或超标量。
如图,我们对每个阶段扩大一倍,那么可以同时对两个指令进行操作。第一、二条指令同时进入阶段一,经过一个时钟周期,第一、二条指令进入阶段二,同时第三、四条指令进入阶段一…这样每个阶段两条指令并行前行,到第五个周期就有两条指令同时被完成。
流水线思想的冒险
流水线思想的冒险分为三种:结构冒险、数据冒险、控制冒险 hazard
流水线思想的冒险
数据冒险
1)流水线使得原先有先后顺序的指令同时处理,当出现某些指令组合时,可能会导致使用了错误的数据。
2)因此,cpu采用直通(forwarding)来解决:如果当前指令的源操作数在EX/MEM的流水线寄存器中,就直接将流水线寄存器中的值传递给ALU输入,不去通用寄存器堆取值
3)但不是所有数据冲突都能采用直通解决,要配置cycle等待