一、概述
- 什么是超标量处理器
- 超标量是指 CPU 在一个时钟周期内获取、执行和提交多条指令,这个概念和“标量”对应,标量指 CPU 在一个时钟周期内获取、执行和提交一条指令;
- 顺序的意思是“顺序发射、顺序执行”,是指 CPU 按照指令原始顺序逐条发射、逐条执行,而乱序就是指“乱序发射、乱序执行”。“超标量”一般和“乱序”搭配,“标量”一般和“顺序”搭配。
- 为什么要超标量处理器
-
影响程序执行时间的三个主要因素是:程序要完成的总指令数、执行每条指令需要的周期数、每个周期需要的时间。
-
提高程序执行时间的策略有:
- 减少程序总指令数,取决于编程和算法;
- 减少每条指令的执行周期——并行实现——超标量乱序完成;
- 减少每个周期需要的时间——提高频率,取决于工艺。
因此通过超标量技术来减少每条指令的执行周期,也就是在一个周期里实现多条指令的执行,从而提高处理器速度。
- 流水线
- 流水线分类/性能
超标量 | 非超标量 | |
---|---|---|
乱序 | 1 | × |
顺序 | 2 | 3 |
-
经典的5级流水线
- 取指:IF(Instruction Fetch)
- 译码:ID(Instruction Decode)
- 执行:EXE(Exection)
- 访存:MA(Memory Access)
- 写回:WB(Write Back)
-
超标量处理器流水线
- Frontend:取指令和解码阶段
- Issue:将指令送到对应的功能单元(Function Unit,FU)中执行
- Write back:将指令的结果写到目的寄存器中
- Commit:一条指令被允许更改处理器的状态
-
乱序执行超标量处理器流水线
1> Fetch取指令:从I-Cache中取指令,分支预测器用来决定下一条指令的PC值;
2> Decode解码:识别出指令的类型、需要的操作数和指令的一些控制信号;
3> Register Renaming寄存器重命名:解码阶段得到指令的源寄存器和目标寄存器都是指令集定义的逻辑寄存器,为了解决WAW和WAR假相关性,将逻辑寄存器重命名为处理器的物理寄存器,并用表格记录二者之间的映射关系和未被使用的物理寄存器信息;
4> Dispatch分发:指令派发到发射队列(Issue Queue,IQ)、重排序缓存(Re-Order Buffer,ROB)等部件中;
5> Issue发射:仲裁电路从发射队列中选择合适的指令发送到FU中执行,对于乱序执行的处理器,这是从顺序执行到乱序执行的分界点(前序过程是顺序的,从这里开始乱序发射和执行),直到提交才重新变成顺序;
6> Register File Read:发射的指令需要从物理寄存器堆(Physical Register File,PRF)中读取操作数(也有可能从旁路网络中得到操作数)。超标量处理器一个周期执行数条指令,因此PRF中也需要多个端口;
7> Execute执行:指令得到操作数后在FU中执行,不同类型FU执行不同指令,如负责普通运算的、负责乘累加运算的、负责分支指令运算的、负责load/store指令的等;
8> Write Back写回:FU的计算结果写回到PRF中,也可以通过旁路网络将结果送到需要的地方,一般是FU的输入端(供其他FU计算使用);
9> Commit提交: 将乱序执行的指令按照原顺序提交,因为在分发阶段指令是按顺序写入到ROB中的,当ROB中一条指令之前的所有指令都执行完了,才能离开ROB。指令产生的所有异常也是在提交阶段出来,保证异常的处理按照顺序进行,并且能实现精确的异常。当指令从ROB中离开而退休(Retire),就对处理器的状态进行了修改,且不可逆。 -
指令间的相关性/数据冲突
-
先写后读(Read After Write, RAW),指令的操作数来自之前指令的结果,相关性无法回避——true dependence;
- R1 = R2 + R3;R5 = R1+R4; R1先写后读
-
先读后写(Write After Read, WAR),指令的结果要写入某个寄存器中,但是这个寄存器还在被其他指令读取,无法马上写入,相关性可以避免,只要将结果写到其他寄存器即可——anti-dependence;
- R1 = R2 + R3;R2 = R4 + R5;R2先读后写
-
先写后写(Write After Write, WAW),两条指令的结果都要写入同一个寄存器,相关性可以避免,后面的指令写入其他寄存器即可——output dependence;
- R1 = R2 + R3;R1 = R4 + R5;R1先写后写
WAR和WAW可以通过寄存器重命名的方法去除相关性,寄存器重命名技术在Tomsulo算法中通过保留站核ROB(Re-Order Buffer)完成。
参考资料:
《超标量处理器设计》——姚永斌