【2020/12/4修订】【梳理】计算机组成与设计 第4章 处理器 第4节 指令级并行(docx)

本文介绍了指令级并行(ILP)技术,包括静态多发射和动态多发射,重点讨论了静态多发射中的VLIW和超标量处理器。文章通过实例分析了指令级并行的实现方法,如推测、寄存器重命名和循环展开,并探讨了动态流水线调度、乱序执行以及其在现代处理器中的应用和挑战。
摘要由CSDN通过智能技术生成

配套教材:
Computer Organization and Design: The Hardware / Software Interface (5th Edition)
这是专业必修课《计算机组成原理》的复习指引。建议将本复习指导与博客中的《简明操作系统原理》配合复习。
需要掌握的概念在文档中以蓝色标识,并用可读性更好的字体显示 Linux 命令和代码。代码部分语法高亮。
计算机组成原理不是语言课,本复习指导对用到的编程语言的语法的讲解也不会很细致。如果不知道代码中的一些关键字、指令或函数的具体用法,你应当自行查找相关资料。


第四章 处理器

第一节 数据通路

第二节 流水线 流水线冲突

第三节 异常

第四节 指令级并行

注意

链接:https://pan.baidu.com/s/1Y9T_iCBTPJ81qmh8tRHugw
提取码:0000


第四节 指令级并行
这里只对相应内容简单介绍。如果想要详细学习,请参阅《计算机架构:量化方法》。
指令级并行(instruction-level parallelism,ILP)指的是在一个周期内同时执行多条指令。常用的方法有两种:一种是增长流水线,其利弊已经在前面作了简单分析。另一种是增加硬件单元的数量,即多发射(multiple issue)。
指令发射,指的是指令从译码阶段进入执行阶段。

多发射分为静态多发射(static multiple issue)和动态多发射(dynamic multiple issue)两种。
静态多发射高度依赖编译器,由编译器在编译时,进行相关性分析和静态分支预测,以静态完成指令打包或冒险处理。
指令打包,指的是将同时发射的多条指令合并到一个长指令中。将一个周期内发射的多个指令看成一条多个操作的长指令,称为一个发射包(issue packet)。静态多发射最初被称为超长指令字(VLIW,Very Long Instruction Word),采用这种技术的处理器被称为VLIW处理器。不过,在同一个周期内发射的指令类型是受限制的(例如,只能是一条ALU指令/分支指令、一条Load/Store指令),以降低解码和发射的实现难度。
IA-64(其为RISC)采用这种方法,Intel称其为EPIC(Explicitly Parallel Instruction Computer,显式并行指令计算机)。
冒险处理,指的是减少或消除数据冒险和控制冒险。
做法1:完全由编译器通过代码调度和插入nop指令来消除所有冒险,无需硬件实现冒险检测和流水线阻塞。
做法2:由编译器通过静态分支预测和代码调度来消除同时发射指令间内部依赖,由硬件检测数据冒险并进行流水线阻塞。
即:保证打包指令内部不会出现冒险。
动态多发射处理器由硬件在执行时动态完成指令打包或冒险处理,通常被称为超标量(Superscalar)处理器。针对VLIW处理器的编译结果与机器结构密切相关,在结构有差异(即使指令集相同)的机器上要重新进行编译。而对于超标量处理器,编译器仅进行指令顺序调整,但不进行指令打包,由硬件根据机器的结构来决定一个周期发射哪几条指令。因此,编译后的代码能够被不同结构的机器正确执行。

推测(speculation)基于预测(prediction)的思想,是实现指令打包和冒险处理的基础。前面我们讲过,通过分支预测可以推测分支结果。当分支条件成立的概率不大时,先执行紧随分支指令之后的指令。另一个例子就是假设跟在load指令之前的store指令的地址肯定与这个load指令的不同。于是在需要时,这个load指令可以在store之前执行。
既然是推测,就意味着有时候可以是错的。任何推测机制都必须实现对推测正确性的检测,并在推测错误后回滚(rollback / unroll)已经根据推测结果执行的指令。
编译器可以通过推测机制来调整指令的执行顺序。
软件与硬件在推测错误后的恢复机制是不同的。编译器一般通过插入额外指令来检查推测结果是否正确,并提供负责恢复的指令。而CPU进行该过程时,先缓存推测结果。如推测正确,则将结果直接写入寄存器或内存;反之,清空缓存并重新按正确的顺序执行。
推测机制可能会引发原先没有的异常。编译器的解决方案是:忽略它们,除非该指令确实会被执行并发生异常。在基于硬件的推测中,异常也被暂时存入缓冲区,直到该指令确实会被执行时,才产生异常,并进入正常的异常处理程序。

以下是一个基于MIPS的静态双发射数据通路。

该通路一次读出2条符合要求的指令:一条为计算,一条为存取(没有配对指令时,填充空指令),且ALU指令必须在存取指令之前。可以看出,多了两个ALU,一个用于执行各种算术逻辑操作,另一个则专门计算新的PC值。带符号扩展单元、寄存器堆的读写端口和内存访问端口的数量也翻倍了。
双发射有时可能会引发相对更多的性能损失。例如:如果在load指令后的一条指令需要用到读取的数据,那么这条指令与load指令之间会自动空出一个周期的延迟,称为使用延迟(use latency)。假设紧随其后的下一对指令都需要用到刚才读取的数据,那么这两条指令就要一起停顿一个周期。显然,如果CPU只有单发射,这两条指令之间不用延迟,只需要排在前面的那条指令与load之间隔开1个周期即可。也就是说࿰

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值