Overcoming Data Hazards With Dynamic Scheduling

一个简单的静态调度的流水线会获取一条指令并发出该指令,除非流水线中已有的一条指令与所获取的指令之间存在数据相关性,而这些数据不能被旁路或转发所隐藏。(转发逻辑减少了有效的流水线延迟,因此某些依赖性不会导致危害。)如果存在无法隐藏的数据依赖关系,则冒险检测硬件将从使用结果的指令开始,使管道停顿。在清除依赖关系之前,不会获取或发出任何新指令。

在本节中,我们将探索动态调度,该技术通过硬件对指令执行进行重新排序以减少停顿,同时保持数据流和异常行为。动态调度具有几个优点。首先,它允许在在一个流水线下编译的代码可以在不同的流水线上高效运行,从而无需使用多个二进制文件并针对不同的微体系结构进行重新编译。在当今的计算环境中,许多软件都是来自第三方并以二进制形式分发,因此这一优势非常重要。其次,它可以处理在编译时依赖项未知的某些情况。例如,它们可能涉及内存引用或数据相关分支,或者它们可能来自使用动态链接或分派的现代编程环境。第三,也许是最重要的一点,它允许处理器在等待未解决的等待时通过执行其他代码来减少不可预料的延迟,例如高速缓存未命中。在第3.6节中,我们探讨了基于动态调度的硬件推测,这是一种具有其他性能优势的技术。正如我们将看到的,动态调度的优点是以硬件复杂性的显着增加为代价的。

尽管动态调度的处理器无法更改数据流,但它会尝试避免在存在依赖关系时停顿。相反,编译器的静态流水线调度(在第3.2节中介绍)试图通过分离相关指令来最大程度地减少停顿,以免导致危险。当然,编译器流水线调度也可以用于要在具有动态调度流水线的处理器上运行的代码。

Dynamic Scheduling: The Idea

简单流水线技术的主要局限性在于它们使用按顺序的指令发布和执行:指令以程序顺序发布,并且如果指令在流水线中停滞,则以后的指令将无法继续执行。 因此,如果流水线中两个丢失的指令之间存在依赖关系,将导致危险,并导致停顿。 如果有多个功能单元,则这些单元可能会闲置。 如果指令j依赖于流水线中当前正在执行的长时间运行的指令i,则必须停滞j之后的所有指令,直到i完成并且j可以执行为止。比如说如下:

因为fadd.d对fdiv.d的依赖性导致流水线停顿,fsub.d指令无法执行。但是,fsub.d并不依赖于流水线中的任何数据。这种冒险造成了性能限制,可以通过不要求以程序顺序执行指令来消除性能限制。

在经典的五阶段流水线中,可以在指令解码(ID)期间检查结构和数据冒险:当一条指令可以执行而没有冒险时,它是从ID发出的,并意识到已解决了所有数据冒险。

为了使我们能够开始执行上一个示例中的fsub.d,我们必须将发布过程分为两部分:检查是否存在任何结构冒险,并等待不存在数据冒险。因此,我们仍然使用有序指令发布(即,按程序顺序发布的指令),但是我们希望一条指令在其数据操作数可用时立即开始执行。这样的流水线会无序执行,这意味着无序完成。

无序执行会引入WAR和WAW危险的可能性,这在五级整数流水线中不存在,并且它在逻辑上扩展到有序浮点流水线。 考虑以下RISC-V浮点代码序列:
fmul.d和fadd.d(对于寄存器f0)之间存在反相关性,并且如果管道在fmul.d(正在等待fdiv.d)之前执行fadd.d,则它将违反 反依赖性,产生战争危险。 同样,为避免违反输出依赖性,例如在fdiv.d完成之前由fadd.d写入f0,必须处理WAW危险。 正如我们将看到的,通过使用寄存器重命名可以避免这两种危害。

乱序完成还给异常处理带来了极大的复杂性。具有无序完成的动态调度必须保留异常行为,从某种意义上说,如果确实按照严格的程序顺序执行程序,则确实会出现那些异常。动态调度的处理器通过延迟关联异常的通知直到处理器知道该指令应该是下一条完成的指令来保留异常行为。

尽管必须保留异常行为,但是动态调度的处理器可能会生成不精确的异常。如果引发异常时的处理器状态看起来不像严格按照程序顺序顺序执行了指令,则异常是不精确的。对于以下两种可能出现的情况会发生不精确的异常:
1.流水线可能已经完成了指令,这些指令的执行顺序比引起异常的指令晚于程序顺序。
2.流水线可能尚未完成某些指令,这些指令在程序顺序上早于导致异常的指令。
不精确的异常使指令很难在异常后重新开始执行。除了在本节中解决这些问题之外,我们将在3.6节中讨论一种在处理器上下文中提供精确异常的解决方案。对于浮点异常,已使用其他解决方案,如附录J中所述。

为了兼容乱序执行,我们实质上将简单的五级流水线的ID阶段分为两个阶段:
1.issue——解码指令,检查结构冒险。
2.读取操作数——等待直到没有数据冒险,然后读取操作数。
指令提取阶段在发出阶段之前,可以提取到指令寄存器或待处理指令队列中。然后从寄存器或队列中发出指令。执行阶段紧跟在读取操作数阶段之后,就像在五阶段流水线中一样。 执行可能需要多个周期,具体取决于操作。

我们区分一条指令何时开始执行以及何时完成执行。在两次之间,指令正在执行。我们的流水线允许同时执行多个指令;没有此功能,将失去动态调度的主要优势。一次执行多个指令需要多个功能单元和/或流水线功能单元,或两者兼而有之。因为这两种功能(流水线功能单元和多个功能单元)对于流水线控制而言基本上是等效的,所以我们将假定处理器具有多个功能单元。

在动态调度的流水线中,所有指令均按顺序通过发布阶段(按顺序发布);但是,它们可能会停滞,或者在第二阶段会互相绕开(读取操作数),从而使执行顺序混乱。记分板技术是一种在资源充足且不依赖数据的情况下允许指令无序执行的技术。它以CDC 6600记分牌命名,该记分牌开发了此功能。在这里,我们重点介绍一种称为Tomasulo算法的更复杂的技术。主要区别在于Tomasulo的算法通过有效地动态重命名寄存器来处理反依赖性和输出依赖性。此外,Tomasulo的算法可以扩展为处理推测,该技术可以通过预测分支的结果,在预测的目标地址执行指令以及在预测错误时采取纠正措施来减少控制依赖的影响。尽管使用记分板可能足以支持更简单的处理器,但更复杂,性能更高的处理器会利用推测。

Dynamic Scheduling Using Tomasulo’s Approach

IBM 360/91浮点单元使用一种复杂的方案来允许乱序执行。该方案是由Robert Tomasulo发明的,用于跟踪何时可以使用指令的操作数以最大程度地减少RAW延迟,并在硬件中引入寄存器重命名以最大程度地减少WAW和WAR延迟。尽管在最近的处理器中此方案有多种变体,但它们都依赖于两个关键原理:动态确定一条指令何时准备好执行以及重命名寄存器以避免不必要的延迟。

IBM的目标是从指令集和为整个360计算机系列设计的编译器中实现高浮点性能,而不是从高端处理器的专用编译器中实现高浮点性能。360体系结构只有四个双精度浮点寄存器,这限制了编译器调度的有效性;这是Tomasulo方法的另一个动机。此外,IBM 360/91具有较长的内存访问权限和较长的浮点延迟,这是Tomasulo的算法所要克服的。在本节的最后,我们将看到Tomasulo的算法还可以支持循环多次迭代的重叠执行。

我们将在RISC-V指令集的上下文中解释该算法,该算法侧重于浮点单元和负载存储单元。 RISC-V和360之间的主要区别在于后一种体系结构中存在寄存器存储器指令(一个操作数是寄存器,另外一个是存储器地址)。 由于Tomasulo的算法使用加载功能单元,因此无需进行重大更改即可添加寄存器存储器寻址模式。IBM 360/91还具有流水线功能单元,而不是多个功能单元,但是我们将算法描述为好像有多个功能单元。这也是对这些功能单元进行流水线化的简单概念扩展

仅在操作数可用时才执行一条指令,可以避免RAW危险,而这正是更简单的记分板方法所提供的。由名称依赖引起的WAR和WAW危害通过寄存器重命名得以消除。寄存器重命名可通过重命名所有目标寄存器来消除这些危险,包括对先前指令进行未决读或写的寄存器,以便无序写入不会影响任何依赖于操作数较早值的指令。如果ISA中有足够的寄存器,则编译器通常可以实现这种重命名。原始的360/91仅具有四个浮点寄存器,Tomasulo的算法就是为克服这种不足而创建的。尽管现代处理器具有32–64个浮点和整数寄存器,但在最近的实现中可用的重命名寄存器的数量是数百个。

为了更好地了解寄存器重命名如何消除WAR和WAW阻塞,请考虑以下示例代码序列,其中包括潜在的WAR和WAW阻塞:

有两个反依赖性:在fadd.d和fsub.d之间以及在fsd和fmul.d之间。fadd.d和fmul.d之间也存在输出相关性,从而导致三种可能的阻塞:fadd.d使用f8以及fsub.d使用f8的WAR危害以及WAW危害,因为fadd.d可能比fmul.d更晚完成。还有三个真正的数据依赖关系:在fdiv.d和fadd.d之间,在fsub.d和fmul.d之间以及在fadd.d和fsd之间。

这三个名称相关性都可以通过寄存器重命名来消除。 为简单起见,假设存在两个临时寄存器S和T。使用S和T,可以将序列重写为:

此外,f8的任何后续使用都必须由寄存器T代替。在此示例中,重命名过程可以由编译器静态完成。在代码中查找f8的任何后续用法都需要复杂的编译器分析或硬件支持,因为在前面的代码段和f8的后续用法之间可能存在中间分支。我们将看到,Tomasulo的算法可以处理跨分支的重命名。

在Tomasulo的方案中,寄存器重命名由保留站提供,保留站缓冲等待发出的指令操作数,并与功能单元相关联。 基本思想是,保留站会在操作数可用时立即获取并缓冲该操作数,从而无需从寄存器中获取操作数。 另外,待处理的指令指定将提供其输入的保留站。 最终,当执行中对寄存器的连续写入重叠时,实际上仅使用最后一个来更新寄存器。 作为指示发出后,未决操作数的寄存器说明符将重命名为保留站的名称,从而提供寄存器重命名。

由于保留站的数量可能超过实际寄存器的数量,因此该技术甚至可以消除编译器无法消除的名称依赖所带来的危害。在探索Tomasulo方案的组成部分时,我们将返回到寄存器重命名的主题,并精确地看到重命名是如何发生的以及如何消除WAR和WAW阻塞。

使用保留站而不是集中式寄存器堆会带来其他两个重要特点。首先,阻塞检测和执行控制:每个功能单元的保留站中保存的信息确定何时可以在该单元开始执行指令。其次,将结果从保留站直接传递到保留站的功能单元,而不是通过寄存器。这种旁路是通过公共结果总线完成的,该总线允许所有等待操作数的单元同时加载(在360/91上,这称为公共数据总线或CDB)。在每个时钟发出多个指令并且具有多个执行单元的流水线中,将需要多个结果总线。

Figure 3.10显示了基于Tomasulo的处理器的基本结构,包括浮点单元和加载/存储单元;没有显示执行控制表。每个预约站都持有已发出的指令,并等待在功能单元上执行。如果已经计算了该指令的操作数值,它们也将存储在该条目中;否则,保留站条目将保留提供操作数值的保留站的名称。

加载缓冲区和存储缓冲区保存着来自内存和要传入内存的数据或地址,并且其行为几乎完全与保留站类似,因此我们仅在必要时对其进行区分。浮点寄存器通过一对总线连接到功能单元,并通过一条总线连接到存储缓冲区。功能单元和存储器的所有结果均在公共数据总线上发送,该公共数据总线除加载缓冲区外无处不在。所有保留站都有流水线控制使用的标签字段。

在描述保留站和算法的详细信息之前,让我们先看一下指令执行的步骤。 尽管每个步骤现在可以花费任意数量的时钟周期,但是只有三个步骤:
1. Issue——从指令队列的开头获取下一条指令,该指令以FIFO顺序维护,以确保维持正确的数据流。如果有一个匹配的保留站为空,则将指令和操作数值(如果它们当前在寄存器中)发送给该站。如果没有空的保留站,则存在结构阻塞,指令发布将暂停,直到释放站或缓冲区为止。如果操作数不在寄存器中,请跟踪将产生操作数的功能单元。此步骤将重命名寄存器,从而消除了WAR和WAW的危害。(此阶段有时在动态调度的处理器中称为调度。)

2. 执行——如果一个或多个操作数尚不可用,请在等待公共数据总线计算的同时对其进行监视。当一个操作数变为可用时,它将被放置在任何等待它的保留站中。当所有操作数均可用时,可以在相应的功能单元上执行该操作。通过将指令执行延迟到操作数可用之前,可以避免RAW危害。(某些动态调度的处理器将此步骤称为“Issue”,但我们使用名称“ execute”,该名称在第一个动态调度的处理器CDC 6600中使用。)

注意,对于相同的功能单元,可以在相同的时钟周期内准备好几条指令。 尽管独立的功能单元可以在相同的时钟周期内开始执行不同的指令,但是如果单个功能单元准备好一个以上的指令,则该单元将不得不在其中选择。 对于浮点保留站,此选择可以任意选择。 但是,加载和存储会带来额外的复杂性。

加载和存储需要两步执行过程。当基址寄存器可用时,第一步将计算有效地址,然后将有效地址放入加载或存储缓冲区中。内存单元可用后,将立即执行加载缓冲区中的加载。存储在存储缓冲区中的存储将等待该值被存储,然后再发送到存储单元。通过有效的地址计算,按程序顺序维护装入和存储,这将有助于通过内存防止危险。

为了保留异常行为,在程序顺序中位于该指令之前的分支完成之前,不允许任何指令启动执行。这种限制保证了在执行过程中导致异常的指令确实会被执行。在使用分支预测的处理器中(就像所有动态调度的处理器一样),这意味着处理器必须在允许分支后的指令开始执行之前就知道分支预测是正确的。如果处理器记录了异常的发生,但没有实际引发异常,则一条指令可以开始执行,但直到进入Write Result后才停止。

推测提供了一种更灵活,更完整的异常处理方法,将在稍后展示推测如何处理此问题。

3. 写入结果-当结果可用时,将其写入CDB并从那里写入寄存器以及等待该结果的任何保留站(包括存储缓冲区)中。将存储区存储在存储缓冲区中,直到要存储的值和存储地址都可用为止,在存储单元空闲时立即写入结果;否则,存储区将变为可用状态。

检测和消除危害的数据结构附加到保留站,寄存器文件,加载和存储缓冲区,而附加到不同对象的信息略有不同。这些标记实质上是用于重命名的扩展虚拟寄存器集的名称。如何分辨硬件上的寄存器应用在哪个操作上:在我们的示例中,标记字段是4位数量,表示五个预留站之一或五个负载缓冲区之一。这种组合产生了相当于10个寄存器(5个预留站+5个加载缓冲区)的寄存器,可以将其指定为结果寄存器(与360架构包含的四个双精度寄存器相对)。在具有更多实际寄存器的处理器中,我们希望重命名以提供更大的虚拟寄存器集,通常编号为数百。标签字段描述哪个保留站包含将产生所需结果作为源操作数的指令。

发出指令并等待源操作数后,它将通过保留站号引用该操作数,在该保留站号中已分配了要写入寄存器的指令。未使用的值(例如零)表示操作数已在寄存器中可用。由于预留站的数量比实际寄存器的数量多,因此通过使用预留站号重命名结果可以消除WAW和WAR危险。尽管在Tomasulo的方案中,保留站用作扩展的虚拟寄存器,但其他方法可以使用带有附加寄存器的寄存器集或诸如重排序缓冲区之类的结构,我们将在第3.6节中介绍。

在Tomasulo的方案以及我们为支持投机活动而研究的后续方法中,结果在由预留站监视的总线(CDB)上广播。公用结果总线和预留站从总线中检索结果的组合实现了在静态调度的流水线中使用的转发和旁路机制。但是,这样做时,动态调度的方案(例如Tomasulo算法)会在源和结果之间引入一个延迟周期,因为结果的匹配及其使用要等到Write Result阶段结束后才能完成,与之相反,Execute阶段的末尾,以获得更简单的管道。因此,在动态调度的流水线中,产生指令和消耗指令之间的有效等待时间比产生结果的功能单元的等待时间至少长一个周期。

重要的是要记住,Tomasulo方案中的标签是指将产生结果的缓冲区或单元。 当指令发布给保留站时,寄存器名称将被丢弃。 (这是Tomasulo的方案与记分板之间的主要区别:在记分板中,操作数保留在寄存器中,并且仅在产生指令完成并且可以执行消费指令之后才读取。)

预留态有七个域:

寄存器有一个域:
Qi——保留操作的保留站号,其结果应存储到该寄存器中。如果Qi的值为空(或0),则当前没有活动指令正在计算该寄存器的结果,这意味着该值仅是寄存器的内容。
加载和存储缓冲区每个都有一个字段A,一旦执行的第一步完成,它就会保存有效地址的结果。

在下一节中,我们将首先考虑一些示例,这些示例说明了这些机制的工作原理,然后研究了详细的算法。

Computer Architectrure: Quantitative Approch 第三章第四节相关推荐

  1. Computer Architectrure: Quantitative Approch 第三章第十三节

    Fallacies and Pitfalls 我们的少数谬误集中在预测性能和能源效率以及从时钟频率或 CPI 等单一指标进行推断的难度上. 我们还表明,对于不同的基准测试,不同的架构方法可能具有完全不 ...

  2. Computer Architectrure: Quantitative Approch 第三章第九节

    在高性能处理器特别是多issue处理器仅仅有高准确性预测是不够的,还需要高带宽指令流.现在的多issue处理器会一个时钟传递4-8个指令.我们首先考虑如何提高指令传输带宽,再考虑在执行先进推测时的关键 ...

  3. matlab 通过矩阵变换使图像旋转平移_数字图像处理|P11 第三章 第四节 图像的几何变换...

    第四节 几何变换 图像生成过程中,由于系统本身具有非线性或拍摄角度不同,会使生成的图像产生几何失真.几何失真一般分为系统失真和非系统失真,系统失真是有规律的.能预测的:非系统失真则是随机的.例如:(1 ...

  4. 微信小程序教学第三章第四节(含视频):小程序中级实战教程:下拉更新、分享、阅读标识...

    为什么80%的码农都做不了架构师?>>>    下拉更新.分享.阅读标识 本文配套视频地址: https://v.qq.com/x/page/h0554i4u5ob.html 开始前 ...

  5. 哈尔滨工业大学软件构造课程笔记第三章第四节

    3.4 面向对象的编程(OOP) 1. 基本概念:对象.类.属性和方法 对象 现实世界中的对象有两个共同特征:它们都有状态和行为. 识别现实对象的状态和行为是开始考虑面向对象编程的好方法. 对于你看到 ...

  6. 初级会计实务--第三章第四节、应交税费

    第四节.应交税费 1.应交税费概述 2.应交增值税 是以商品再流转过程中实现的增值额作为计税依据而征收的一种流转税 六气两水油烟煤,三农饲料和化肥 图书报纸和杂志,音像电子二甲醚 交邮建筑不动产,电信 ...

  7. 计算机网络离不开光缆,九年级物理全册 第二十一章 第四节 越来越宽的信息之路习题课件 新人教版.ppt...

    九年级物理全册 第二十一章 第四节 越来越宽的信息之路习题课件 新人教版.ppt 第二十一章信息的传递,第四节越来越宽的信息之路,1微波的性质更接近光波,大致沿_______传播,需要每隔_____k ...

  8. 传热学环肋肋效率matlab程序,传热学 第二章第四节 通过肋片的导热.pdf

    传热学 第二章第四节 通过肋片的导热 第四节 通过肋片的导热 第二章 导热基本定律及稳态导热 传热 学 第一节 导热基本定律 (Heat Transfer ) 第二节 导热微分方程式 (Heat Tr ...

  9. 第四章第四节数据资产盘点-数据资产梳理

    第四章第四节数据资产盘点-数据资产梳理 在完成业务价值链.数据场景梳理后,盘点业务流程环节中产生的重要数据 ,仍以贷款为例,如图所示: 比如在授信业务节点会产生客户信息和授信合同信息等数据快,这个业务 ...

  10. 第二章 第四节:替换和切割

    Python基础入门(全套保姆级教程) 第二章 第四节:替换和切割 strip() 去掉字符串左右两端的空白符(空格, \t, \n) s = " 你好, 我叫 周杰伦 " s1 ...

最新文章

  1. MySQL的约束、多表查询、子查询
  2. 价值观对做产品的三点影响
  3. mysql怎么对比表结构_mysql查看表结构2种方式对比
  4. 推荐系统遇上深度学习(八)--AFM模型理论和实践
  5. 用Dreamweaver+ASP实现分页技术的参考
  6. 安卓案例:利用SQLiteDatabase操作数据库与表
  7. Linux Bash Shell字符串抽取、按列合并和格式化输出
  8. 360浏览器导出Excel闪退BUG
  9. 关于iostream.h与iostream的区别
  10. matlab实现最速下降法
  11. [自测]linux运维100题目(阿里巴巴内部题目)
  12. html5 3D地球转动动画js特效
  13. TLS流量的X509证书解析,从pcap获取证书并解析
  14. 平安性格测试题及答案_平安人寿做性格测试怎么?
  15. 进程的同步和互斥反映了_用信号量解决进程的同步与互斥探讨【持续更新】
  16. java中API什么意思
  17. 战神引擎 过黄列表教程
  18. 黑苹果双系统时间不一致_解决 Windows/macOS 双系统时间不同步问题
  19. 南京大学2021计算机考研复试线是多少,南京大学2021研究生复试分数线是多少
  20. 《魔兽世界》营收出现大幅下滑

热门文章

  1. 2029年会实现通用人工智能吗?Gary Marcus「叫板」马斯克:赌十万美元如何?
  2. BZOJ4567[Scoi2016]背单词
  3. 为什么1//0.1等于9.0,而1//-0.1=-10?
  4. Everything+Wox介绍和使用方式
  5. Unity多人联机框架Mirro学习记录(一)
  6. rap开发与rcp开发_使用RAP将RCP应用程序转换为Web应用程序
  7. 【C语言】(用函数实现)任意给定两个正整数a和n,计算a+aa+aaa+aa...(n个a)的和。(例如输入1,3即为计算1+11+111的值)。
  8. 面对骚扰短信,不是回TD退订,而是要回0000!(附正确拦截骚扰短信教程)
  9. linux环境下安装cwp的地震专业软件su
  10. 云安全 | 云工作负载保护平台 CWPP