第16章 指令级并行与超标量处理器
处理器体系结构的超标量实现是指常见指令--整数与浮点算术、加载存储和条件分支--可以同时启动,但独立执行。
16.1 概述
超标量方法的本质是能在不同的流水线中独立地并发地执行指令。
在传统的标量组织结构中,其并行性是通过允许许多指令在同一时间处于流水线的不同阶段来实现来实现的。在超标量组织结构中。存在多个功能单元,其中的每一个都以流水线的形式实现。每个单独的功能单元通过其流水化结构提供了一定程度的并行性。
16.1.1 超标量与超流水
实现更高性能的另一种方法被称为超流水,利用以下事实:许多流水段执行任务所需时间不足半个时间周期。因此,内部时钟速度加倍就能在一个外部时钟周期执行2个任务。
16.1.2 限制
超标量方法依赖于并行执行多条指令的能力。术语指令级并行是指程序指令平均并行执行的程度。把给予编译器的优化和硬件技术结合起来,可以最大化指令级并行。
限制指令级并行的5种情况:
真数据相关;
程序相关;
资源冲突;
输出相关;
反相关;
加载延迟的一个补偿方法是编译器对指令进行重排序,以便一条或更多不依赖于该内存加载的后续指令可以启动流水过程。
程序相关,指令序列种的分支的存在使得流水线操作复杂化。分支(跳转或不跳转)后面的指令于分支之间有程序相关性,在分支执行之前都无法执行。
如果使用了变长指令,那么又会产生另外一种程序相关。因为任何特定指令都是未知的,所以必须至少对其进行部分译码之后,才能取下一条指令。
资源冲突,两条或更多指令同时对相同资源的竞争。资源包括:内存、高速缓存、总线、寄存器和功能单元。
对流水线来说,资源冲突表现出于数据相关类似的行为。但是,也有差异性。一方面,资源冲突可以通过资源重复来克服,但是真数据相关是无法消除的。此外,当操作需要较长时间完成的,可以通过把合适的功能单元流水化来最小化资源冲突。
16.2 设计问题
当指令序列种的指令是独立的,并因此可以通过重叠并行执行时,就存在指令级并行。
指令级并行的度由代码中的真数据相关性和程序相关的评率来决定的,而这些因素又取决于指令集架构和应用。指令级并行还取决于被称为操作时延的因素:指令结果可以被后续指令用作操作数所需的时间。时延决定了数据或程序相关将导致多少延迟。
机器并行性是对处理器利用指令级并行能力的一种度量。机器并行性取决于同时能获取并行执行的指令条数(并行流水线的数量),以及处理器发现独立指令所用机制的速度和复杂性。
16.2.2 指令发射策略
机器并行性并不仅仅是每个流水段有多个实例的问题。处理器必须还能识别指令集并行性,并能协调指令的并行取指、译码和执行。
处理器试图在当前执行带你之前就查找定位能被送入流水线并执行的指令。有三种重要的顺序:
指令取指的顺序;
指令执行的顺序;
指令更新寄存器和内存内容的顺序;
处理器越复杂,这些顺序之间的严格关系对它的约束就越小。但是,处理器的一个必然约束是:结果必须正确、
一般来说,我们可以把超标量指令发射策略分为以下几类:
按序发射,按序完成:按串行执行的顺序来发射指令,并按照相同的顺序写结果,即使是标量流水线也不会使用。
按序发射,无序完成:标量risc处理器使用无序完成来提高多个周期的指令的性能,其指令发射的逻辑也比按序完成更复杂。此外,处理指令中断和异常也更困难。
无序发射,无序完成:在按序发射种,处理器只会译码到相关或者冲突点的指令,在冲突被解决之前,不会译码其他指令。因此,处理器无法看到冲突点之后的指令可能是独立于已经在流水线中的指令,且可能被有效地引入流水线中。为了允许无序发射,必须分离流水线的译码阶段和执行阶段,通过指令窗口的缓冲区来完成,其结果就是处理器具有前瞻属性,允许识别可以送入执行阶段的独立指令。
指令窗口不是一个额外的流水段,指令在窗口中仅仅意味着处理器有关于该指令的足够信息来决定什么时候发射该指令。
重排序缓冲区是支持无序完成的常用技术。
16.2.3 寄存器重命名
反相关和输出相关都是存储冲突的例子。多条指令竞争使用相同的寄存器位置,从而产生了影响性能的流水线限制。
一种处理这种类型存储冲突的方法是以传统的资源冲突解决方法为基础的:资源复制。本书将其称为寄存器重命名。从本质来说,寄存器是由处理器硬件动态分配的,它们与指令在不同时间点所需的值相关联。
16.2.4 机器并行性
超标量处理器中用来提高性能的三种硬件技术:资源复制、无序发射和重命名。
不进行寄存器重命名就增加功能单元可能是不值得的。使用大小为8和更大的指令窗口能获得的获益在数量上存在显著差异。如果指令窗口太小,数据相关性会妨碍额外功能单元的有效利用,处理器必须具有前瞻性,能发现相关的指令,以便更充分利用硬件。
16.2.5 分支预测
任何高性能流水线计算机都必须解决处理器分支的问题。intel预取之后的下一条顺序指令以及推测性预取分支目标指令来解决这个问题。
随着超标量计算机的发展,延迟分支策略的应用越来越少,其原因在于在延迟槽中需要执行多条指令,这引发了与指令依赖性有关的问题。超标量机器又回到了risc之前的分支预测技术。
16.2.6 超标量执行
取指阶段包括了分支预测,用来形成动态指令流。检查指令流的相关性,可能删除一些人为的依赖性。然后处理器把指令分配到执行窗口。在该窗口中,指令不再是一个连续的流,而是按照它们真正的数据相关性进行组织。处理器按照真实的数据相关性和硬件资源的可用性来确定的顺序来执行每条指令。最后,从概念上来说,指令按照顺序重新排序并记录其结果。
由于利用了并行性,多条流水线,指令完成的顺序可以不同于静态程序展示的顺序。指令完成后不能立即更新永久处理器和程序可见的寄存器,结果必须保存在某种临时寄存器,相关指令可以使用这些临时寄存器,然后当确定顺序模型已经执行该指令时,再将其结果永远保存。
16.2.7 超标量实现
关键要素:
指令获取策略通常利用预测条件分支的结果,以及获取条件分支指令之外的指令,来同时获取多条指令。这些功能要求使用多个流水线取指和译码段,以及分支预测逻辑。
涉及寄存器的值来确定真相关的逻辑,以及在执行过程中把这些值传递到需要它们的位置的机制。
多条指令并行启动或发射的机制。
并行执行多条指令的资源,包括多个流水线功能单元,能同时服务多个内存引用的存储器层次结构。
按顺序提交进程状态的机制。
16.3.1 前端
前端构成:分支预测单元、取指和译码单元以及指令队列。