1. 为什么需要超标量
因为采用超标量技术可以极大的提高处理器处理程序的速度。要加快处理器处理程序的速度,有3种方法:
- 减少程序的代码量
- 减少每条指令在处理器中执行所需要的周期数(超标量: 一个周期可以同时执行多条指令), 或者减少指令的执行周期数。
- 减少处理器的周期时间(提高处理器的频率)
2. 常见的5级流水
取值:使用PC寄存器的值作为地址,从I-Cache中取出指令,并将指令存储到指令寄存器中。
译码:将指令进行解码,并根据解码的值来读取寄存器堆
执行:根据指令的类型,完成计算任务。例如对算术指令完成算术运算,对访存指令完成地址的计算。
访存:访问D-Cache, 只对访问存储器类型的指令起作用(load/store)
写回:如果指令存在目的寄存器,将结果写回最终的目的寄存器
3. 指令间的相关性
write after read(WAR), 先读后写,假相关性,可以用重命名解决。
Write after write(WAW), 写后写,假相关性,可以用重命名解决。
Read after write(RAW), 先写后读,具有真相关性,用重命名的办法解决不了。
4. 乱序执行的流水线
- Fetch(取指令): 主要从I-cache中取指和分支预测。
- Decode(解码): 主要用来译码出指令的类型,源寄存器和目的寄存器。指令类型用来将指令发送到不同的执行单元,源寄存器用来从register file中读取源操作数。目的寄存器用来写回执行结果
- Rename(重命名): 用于解决WAW和WAR的相关性问题,提高处理器的处理速度
- Dispatch(分发) : 在这个阶段,被重命名之后的指令会被写到发射队列(issue queue), 重排序缓存(ROB)和store buffer中。分发阶段可以和寄存器重命名阶段放在一起,也可以将这一部分单独使用一个stage.
- Issue(发射): 在这个阶段,仲裁电路会从issue queue中挑选出合适的指令发送到FU中执行,可以顺序发射,也可以乱序发射。在发射队列中还存在唤醒电路,它可以将发射队列中对应的源操作数置为有效的状态。
- Register FIle Read(读取寄存器):被仲裁得到的指令可以从PRF中得到源操作数,也可以从旁路网路中得到操作数。
- Execute(执行):对数据进行算术或者逻辑运算, load/store指令进行地址计算,访存。
- Write back(写回): 这个阶段会将FU计算的结果写回到物理寄存器堆中,同时还需要通过旁路网路将计算结果送到各个执行单元的输入端。
- Commit(提交): 在ROB中,只有一条指令前面所有的指令都执行完了,才能从ROB中离开。
小结
超标量处理器可以在一个周期内执行多条指令,提高了处理器的处理速度,由于有相关性的问题,自然也引入了重命名的方法。