超标量处理器的本质特点是:
1、能够同时发射多条指令,进一步提升处理器的指令处理能力
2、支持指令“乱序执行”,当指令由于相关性而被阻塞时可以从后续指令中找出不相关的指令进行执行
3.1 标量流水线的局限性
1、标量流水线最大的吞吐率不会超过每周期1条指令
==>超标量的解决方法:每个时钟周期启动多条指令执行,并行流水线
2、将不同类型的指令放在一条流水线中进行处理,效率低下
==>超标量的解决方法:多配置流水线、多记录缓冲技术
3、为了保证流水线的步调一致而插入的停顿使流水线产生很多气泡
==>超标量的解决方法:动态流水线
1、并行流水线:同一周期启动多条指令执行,增加了流水线的宽度
2、多配置流水线:在流水线的执行阶段为不同类型的指令提供不同的执行部件(子流水线)
3、超标量流水线:属于并行流水线,也属于多配置流水线,可以采用动态流水线技术。
4、动态流水线:支持乱序执行的并行流水线。动态流水线通过使用复杂的多记录缓冲来实现乱序执行,并允许指令以可变的顺序进入和离开缓冲。
3.1.1 标量流水线吞吐率的上限
深流水线通过减少每段逻辑门级数来降低时钟周期。
3.1.2 低效的统一流水线
3.1.3 严格流水线导致的性能损失
3.2 从标量流水线到超标量流水线
3.2.1 并行流水线
相对于标量流水线来计算,它取决于并行流水线的宽度。
3.2.2 多配置流水线
优点:每条流水线只执行一种指令,因此可以根据其特点进行专门的优化设计并采用高效的硬件实现。每条指令只需要执行必要的延迟并流过该子流水线的所有段。
3.2.3 动态流水线
分派缓冲和再定序缓冲
3.3 超标量流水线综述
TEM6级流水线:取指,译码,分派,执行,完成和提交
3.3.1 取指
指令cache在物理组织上要足够宽,每行要能存储s条指令来满足流水线的一次取操作。
取指段的设计目标就是增大取指段的宽度;
主要障碍:
1、读取的s条指令没有对齐,这和指令cache的物理组织有关;
2、控制流改变了取指集中的指令。
对齐问题的解决方法:
1、编译时使用静态技术,编译器了解指令cache的组织结构,在存储器中就实现行对齐。
导致的问题:目标代码调入到不同组织的I-cache中时可能会发生不对齐的情况,静态代码占据了大范围的地址,降低了cache命中率。
2、执行时由硬件协助解决,即使指令组跨越阵列行边界,对齐硬件也能保证一个周期内取出s条指令。
3.3.2 指令译码
指令译码主要包括指令的识别、指令类型的确定以及指令间相关性的检测。
指令译码的复杂度受两个因素影响:ISA和并行流水线的宽度。
RISC中,译码段将成为超标量流水线中的关键路径
预译码:将指令译码的部分工作转移到指令cache进行,当cache失效并需要从存储器调入一个cache块时,在内存与cache之间可以增加一个硬件将cache块中的指令进行预译码。译码的信息以预译码标识位的形式连同指令一起存在于指令cache中,在指令译码时简化操作。
在CISC和RISC中均可以使用。
预译码对处理器设计的两个主要影响:
1、由于在存储器到指令cache的通路上增加了预译码操作而增加了指令cache的失效开销
2、cache的大小由于存储预译码标识位而增大
3.3.3 指令分派
超标量属于多配置流水线,其执行段使用了很多不同类型的执行部件,不同类型的指令需要在不同的执行部件上执行,因此存在分派阶段,确定指令应该在哪一个执行部件上执行。
保留站将指令译码和执行加以分离,从而平衡了译码段以及执行段吞吐率的频繁变化,消除了译码段不必要的停顿,同时也为执行部件输送足够的指令。
集中式保留站:可以被各种类型的指令共用,使用率较高,但是硬件设计非常复杂,需要集中控制并且要设置多个端口来满足多个部件的同时访问
分布式保留站:只需要一个端口和少数几条记录项,硬件简单,但是总的利用率低。当一种类型的保留站中各记录项都被占用时,所有这种类型的后续指令都必须停顿。
二者结合称为分组保留站
发射和分派:在分布式保留站中,分派是指译码后指令同相应类型的功能部件之间的连接;而发射是指指令在功能部件中执行的初始化。在集中式保留站中,两个可以互用。
3.3.4 指令执行
超标量流水线的核心。
设置多个功能部件时一种空间并行性的体现;功能部件流水化实现时时间并行性的体现。为避免结构相关造成的处理器停顿,功能部件的数目要大于流水线的数目。
3.3.5 指令的完成和提交
超标量流水线的基本结构:前端是顺序执行,执行段(保留站和再定序缓冲之间)式乱序执行,后端是顺序提交。
本书中对指令的完成的定义是得到指令结果并写入处理器的物理寄存器中;指令提交的定义是得到指令结果并写入到对应的存储器中。即完成是更新处理器状态,提交是更新存储器状态。
指令发生异常时应该能够把当前机器的体系结构和状态保存起来,异常处理完毕后再恢复指令的执行。机器这种能以单条指令的粒度挂起和重启程序的能力称为精确异常。即使程序在乱序执行,机器状态的保存也要满足顺序性。
有新指令处理结束;
if 前面没有未结束指令 then:
当前指令完成和提交;
for 依次遍历后续指令:
if 指令处理已结束 then:指令完成和提交;
else:
break;
else:
当前指令插入到重排序缓存,等待前面指令处理结束