计算机体系结构基础知识介绍之动态调度Tomasulo 算法(二)

Tomasulo方法是一种计算机硬件架构的算法,用于动态调度指令的执行,允许乱序执行以及更有效率的使用多个执行单元。它由IBM公司在1967年提出,首次应用是在IBM System/360 Model 91的浮点单元上。Tomasulo方法的主要创新包括在硬件中进行寄存器重命名、为所有执行单元设置预留站、以及使用一个公共数据总线(CDB)来广播计算出的值给所有可能需要它们的预留站。这些发展使得指令能够更好地并行执行,避免了在使用记分板或其他早期算法时可能出现的停顿。Tomasulo方法还可以扩展到处理推测,一种通过预测分支的结果,执行预测目标地址的指令,并在预测错误时采取纠正措施来减少控制依赖影响的技术。

介绍一下假依赖和真实的数据依赖。假依赖是指两个指令之间没有真正的数据流,但是由于使用了相同的寄存器名字而造成的依赖关系。例如,如果指令A写入寄存器f0,然后指令B读取寄存器f0,那么就有一个真实的数据依赖,因为B需要等待A的结果。但是,如果指令A写入寄存器f0,然后指令B写入寄存器f0,那么就有一个假依赖,因为B并不需要A的结果,而是要覆盖它。这种假依赖叫做输出依赖(WAW),因为两个指令都要写入同一个寄存器。另一种假依赖叫做反依赖(WAR),因为一个指令要写入一个寄存器,而另一个指令要读取同一个寄存器。例如,如果指令A写入寄存器f0,然后指令B读取寄存器f0,那么就有一个反依赖,因为如果B先于A执行,那么就会读取错误的值。

假依赖会限制指令的乱序执行,因为它们会造成冒险。冒险是指由于流水线中的指令之间的依赖关系而导致的潜在错误或停顿。例如,如果有一个WAW冒险,那么就意味着后面的指令可能会比前面的指令先完成,并且把前面的指令的结果覆盖掉。如果有一个WAR冒险,那么就意味着后面的指令可能会比前面的指令先执行,并且读取错误的值。

Tomasulo方法可以通过在硬件中进行寄存器重命名来消除假依赖和避免冒险。寄存器重命名是指用一组临时寄存器来代替原来的寄存器名字,从而让每个指令都有自己独立的目标寄存器。这样就可以避免两个指令之间因为使用同一个寄存器名字而产生的假依赖。例如,我们可以用S和T来代替f6和f8,从而消除了反依赖和输出依赖。

当然,这种重命名并不会影响真实的数据依赖,因为真实的数据依赖是由于数据流而产生的,而不是由于寄存器名字而产生的。

 

例如,在上面的代码序列中,我们还是要保留f0作为fdiv.d和fadd.d之间的数据传递方式,因为这是一个真实的数据依赖。真实的数据依赖不能被消除,但是可以通过动态调度来减少它们造成的停顿。这样就可以让一些没有数据依赖或者已经解决了数据依赖的指令先执行,并且利用多个执行单元来提高并行度。

Tomasulo可以通过使用预留站来提供寄存器重命名,从而消除假依赖和避免WAR和WAW冒险。

预留站是一种缓冲器,它与功能单元相关联,可以存储等待发射的指令的操作数。基本的思想是,预留站在操作数可用时就立即获取并缓冲它,从而不需要从寄存器中读取它。另外,等待的指令指定将提供其输入的预留站的名字。

当指令被发射时,等待操作数的寄存器标识符被重命名为预留站的名字,这就实现了寄存器重命名。因为预留站的数量可能比真实寄存器的数量多,所以这种技术甚至可以消除编译器无法消除的由于名字依赖而产生的冒险。

使用预留站而不是集中式寄存器文件还带来了另外两个重要的特性。
第一,冒险检测和执行控制是分布式的:每个功能单元处的预留站中保存的信息决定了一个指令何时可以在该单元开始执行。
第二,结果直接从缓冲它们的预留站传递给功能单元,而不是通过寄存器。这种绕过是通过一个公共结果总线来完成的,它允许所有等待操作数的单元同时加载(在360/91上,这叫做公共数据总线或CDB)。在每个时钟周期可以发射多条指令并且有多个执行单元的流水线中,需要多于一个结果总线。

下图显示了一个基于Tomasulo方法的处理器的基本结构,包括浮点单元和加载/存储单元;没有显示任何执行控制表。每个预留站保存一个已经被发射并且等待在功能单元执行的指令。如果该指令的操作数值已经被计算出来,它们也被存储在该条目中;否则,预留站条目保持将提供操作数值的预留站的名字。加载缓冲区和存储缓冲区保存从内存来或者去内存的数据或地址,并且几乎完全像预留站一样工作,所以我们只在必要时区分它们。浮点寄存器通过一对总线连接到功能单元,并且通过一个单独的总线连接到存储缓冲区。所有来自功能单元和内存的结果都通过公共数据总线发送,它到处都有,除了加载缓冲区。所有预留站都有标签字段,由流水线控制使用。

使用 Tomasulo 算法的 RISC-V 浮点单元的基本结构。 指令从指令单元发送到指令队列,并按照先进先出 (FIFO) 顺序发出。 保留站包括操作和实际操作数,以及用于检测和解决危险的信息。 加载缓冲区具有三个功能:(1) 保存有效地址的组成部分,直到计算出来;(2) 跟踪内存上等待的未完成加载;(3) 保存等待 CDB 的已完成加载的结果 。 类似地,存储缓冲区具有三个功能:(1)保存有效地址的组成部分直到计算出来,(2)保存等待数据值存储的未完成存储的目标内存地址,以及(3)保存 要存储的地址和值,直到内存单元可用。 来自 FP 单元或加载单元的所有结果都放在 CDB 上,CDB 进入 FP 寄存器文件以及保留站和存储缓冲区。 FP加法器实现加法和减法,FP乘法器实现乘法和除法。

在Tomasulo方法中,一个指令会经历三个步骤,分别是:

  1. 发射——从指令队列的头部获取下一条指令,指令队列是按照先进先出的顺序维护的,以确保正确的数据流。如果有一个空闲的与指令匹配的预留站,就把指令发射到预留站,并且带上操作数值。如果没有空闲的预留站,那么就有一个结构冒险,指令发射就会停顿,直到有一个预留站或缓冲区被释放。如果操作数不在寄存器中,就跟踪将产生操作数的功能单元。这个步骤重命名寄存器,消除了WAR和WAW冒险。(在动态调度的处理器中,这个阶段有时候叫做分派。)
  2. 执行——如果一个或多个操作数还没有准备好,就在等待它们被计算的同时监视公共数据总线。当一个操作数可用时,它就被放入任何等待它的预留站中。当所有操作数都可用时,操作就可以在相应的功能单元执行。通过延迟指令执行直到操作数可用,RAW冒险就被避免了。(一些动态调度的处理器把这个步骤叫做“发射”,但是我们使用“执行”这个名字,它是在第一个动态调度的处理器CDC 6600中使用的。)
  3. 写结果——当结果可用时,把它写到公共数据总线上,然后从那里写入寄存器和任何等待这个结果的预留站(包括存储缓冲区)。存储被缓冲在存储缓冲区中,直到要存储的值和存储地址都可用;然后在内存单元空闲时把结果写入。

检测和消除冒险的数据结构,它们附加在预留站、寄存器文件、加载缓冲区和存储缓冲区上,不同的对象有不同的信息。这些标签本质上是一组扩展的虚拟寄存器的名字,用于重命名。

例如,标签字段是一个4位的量,表示五个预留站或五个加载缓冲区中的一个。这种组合产生了相当于10个寄存器(5个预留站+5个加载缓冲区)的效果,它们可以被指定为结果寄存器(与360架构包含的四个双精度寄存器相反)。在一个有更多真实寄存器的处理器中,我们希望重命名能提供一个更大的虚拟寄存器集合,通常是数百个。

标签字段描述了哪个预留站包含了将产生作为源操作数所需结果的指令。一旦一个指令被发射并且等待一个源操作数,它就通过被分配了将写入寄存器的指令所在的预留站的编号来引用操作数。未使用的值,比如零,表示操作数已经在寄存器中可用。因为预留站的数量比实际寄存器编号多,WAW和WAR冒险通过使用预留站编号来重命名结果而被消除。

虽然在Tomasulo方法中,预留站被用作扩展的虚拟寄存器,但是其他方法可以使用一个有额外寄存器的寄存器集合或者像重排序缓冲区这样的结构。在Tomasulo方法中,以及支持推测的方法中,结果通过一个总线(CDB)广播,它被预留站监视。公共结果总线和从总线上检索结果到预留站的组合实现了静态调度流水线中使用的转发和绕过机制。在这样做时,一个动态调度方案,比如Tomasulo算法,在源和结果之间引入了一个周期的延迟,因为结果和它的使用之间的匹配不能在写结果阶段结束之前完成,而不是像一个更简单的流水线那样在执行阶段结束时完成。因此,在一个动态调度流水线中,在产生结果和消耗结果之间的有效延迟至少比产生结果的功能单元的延迟长一个周期。

在Tomasulo方法中,标签指向将产生结果的缓冲区或单元;当指令发射到预留站时,寄存器名字就被丢弃了。(这是Tomasulo方法和记分板之间的一个关键区别:在记分板中,操作数保留在寄存器中,并且只有在产生指令完成并且消耗指令准备好执行时才被读取。)每个预留站有七个字段:

■ Op——要对源操作数S1和S2执行的操作。
■ Qj,Qk——将产生相应源操作数的预留站;零值表示源操作数已经在Vj或Vk中可用,或者不需要。
■ Vj,Vk——源操作数的值。注意,对于每个操作数,只有V字段或Q字段是有效的。对于加载,Vk字段用来保存偏移量字段。
■ A——用来保存加载或存储的内存地址计算的信息。最初,指令的立即数字段被存储在这里;在地址计算后,有效地址被存储在这里。
■ Busy——表示这个预留站和它附带的功能单元被占用。

寄存器文件、加载缓冲区和存储缓冲区的数据结构,它们也有一些标签字段。这些字段有:

■ Qi——包含了将要把结果存储到这个寄存器的操作的预留站的编号。如果Qi的值是空白(或0),那么没有当前活跃的指令正在计算一个要写入这个寄存器的结果,意味着这个值就是简单地寄存器内容。
■ A——在执行的第一步完成后,保存有效地址的结果。

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

D了一天bug忘了编译

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值