基本思想

  • 核心思想

    • 记录和检测指令相关,操作数一旦就绪就立即执行,把发生RAW冲突的可能性减少到最小;
    • 通过寄存器换名来消除WAR冲突WAW冲突
  • IBM 360/91首先采用了Tomasulo算法
    IBM之所以回会采用Tomasulo算法,是基于以下几个方面的考虑
    (1)IBM360/91的设计目标是基于整个360系列的统一的指令系统和编译器来实现高性能,而不是设计和利用专用的编译器来提高性能。这样,就需要更多地依赖于硬件;
    (2)IBM 360 体系结构只有4个双精度浮点寄存器,限制了编译器调度的有效性;
    (3)360/91的访存时间和浮点计算时间都很长。

    通过寄存器换名可以消除 WAR 冲突和 WAW 冲突
    考虑以下代码
    第2条和第5条指令之间存在输出相关,可能导致WAW冲突;第2条和第5条指令之间存在反相关,可能导致WAR冲突。若是采用记分牌算法,可能会导致长时间的停顿。可以采用消除名相关的办法,引入两个临时寄存器S和T:
    下面在MIPS指令集的情况下来介绍 Tomasulo 算法
    先对上图中的各组成部件做一简要说明:
    (1)保留站(Reservation Station)
    保留站设置在运算部件的入口。浮点加法器的入口处共有三个加法保留站,分别命名为Add1、Add2、Add3;浮点乘法器的入口处有两个保留站,分别命名为Mult1、Mult2.每个保留站都有一个标识,唯一地标识了该保留站。每个保留站中保存一条已经流出并等待到本功能部件执行的指令,其内容包括操作码、操作数以及用于检测和解决冲突的信息。在一条指令流出到保留站的时候,如果该指令的源操作数已经在寄存器中就绪,则将之取到该保留站中。如果操作数还没有就绪,则在该保留站中记录将产生这个操作数的保留站的标识。
    (2)公共数据总线CDB(Common Data Bus)
    CDB是该结构中的一条重要的数据通路,所有功能部件的计算结果都是送到CDB上,由它把这些结果直接播送到各个需要该结果的地方。从存储器读取的数据也是送到CDB上。CDB连接到除了load缓冲器以外的所有部件的入口。在具有多个执行部件且采用多发射(即每个时钟周期发射多条指令)的流水线中,需要采用多条CDB。
    (3)load 缓冲器和store缓冲器
    load 缓冲器和 store缓冲器存放的是读写存储器的数据或地址。它们的行为和保留站类似,所以在后面的讨论中也把它们当作保留站来看待。只有在必须区分它们时,才加以区分。
    load缓冲器的作用有以下三个:
     - 存放用于计算有效地址的分量;
     - 记录正在进行的 load操作,等待存储器的响应;
     - 保存已经完成了的load的结果(即从存储器取来的数据),等待CDB传输。
    类似地,store缓冲器的作用有以下三个
     - 存放用于计算有效地址的分量;
     - 保存正在进行的 store 访存的目标地址,该 store 正在等待存储数据的到达;
     - 保存该store的地址和数据,直到存储部件接收。
    (4)浮点寄存器 FP
    共有 16 个浮点寄存器:F0,F2,F4,…,F30. 它们通过一对总线连接到功能部件,并通过 CDB 连接到 store 缓冲器.
    (5)指令队列
    指令部件送来的指令放入指令队列;
    指令队列中的指令按先进先出的顺序发射.
    (6)运算部件
    浮点加法器完成加法和减法操作
    浮点乘法器完成乘法和除法操作

    在Tomasulo算法中,寄存器换名是通过保留站和发射逻辑来共同完成的。当指令发射时,如果其操作数还没有计算出来,则将该指令中相应的寄存器号换名为将产生这个操作数的保留站的标识。指令发射到保留站后,其操作数寄存器号或者换成了数据本身(如果该数据已经就绪),或者换成了保留站的标识,不再与寄存器有关系。
    举一个简单的例子,将上面的结构图做个简化,并增加一个寄存器状态表QjQ_jQj​.
    (1)参见图(b),当指令 MULMULMUL 流出到保留站 Mult1Mult1Mult1 时,由于其操作数 aaa 和 bbb 就绪(在 F2F2F2 和 F4F4F4 中),就将它们从寄存器取到保留站,这样该指令以后就跟 F2F2F2 和 F4F4F4 没有关系了,执行时直接从保留站中取数据。同时将目的寄存器 F0F0F0 对应的 QiQ_iQi​ 标志置为 Mult1Mult1Mult1,表示该寄存器的内容将由保留站 Mult1Mult1Mult1 提供(如图(b)中的虚线所示)。
    (2)参见图(c),当指令 ADDADDADD 流出到保留站 Add1Add1Add1 时,也将操作数 ccc 取到保留站,但发现 F0F0F0 中的操作数还没有就绪,于是就把其提供者 Mult1Mult1Mult1 的标识取到保留站中。这样就有两个地方在等 Mult1Mult1Mult1 的结果。同时,它将目的寄存器 F2F2F2 对应的 QiQ_iQi​ 标志置为 Add1Add1Add1,表示该寄存器的内容将由保留站 Add1Add1Add1 提供。
    (3)参见图(d),当 Mult1Mult1Mult1 的运算结果产生后(设为eee),就把数据放到总线上(广播),所有等待该数据的地方都会自动把数据取走。Add1Add1Add1 中的 ADDADDADD 指令得到该数据后,马上就可以开始执行。

    Tomasulo 算法采用分布的保留站,因而具有以下两个特点:
    (1)冲突检测和指令执行控制是分布的。每个功能部件的保留站中的信息决定了什么时候指令可以在该功能部件开始执行。
    (2)计算结果通过 CDB 直接从产生它的保留站传送到所有需要它的功能部件,而不用经过寄存器。

指令执行步骤:
使用 Tomasulo 算法的流水线需3段:

(1)流出

从指令队列的头部取一条指令。如果该指令的操作所要求的保留站有空闲的,就把该指令送到保留站(设为rrr)。并且,如果其操作数在寄存器中已经就绪,就将这些操作数送入保留站r。如果其操作数还没有就绪,就把将产生该操作数的保留站的标识送入保留站 rrr. 这样,一旦被记录的保留站完成计算,它就直接把数据送给保留站rrr。这一步实际上是进行了寄存器换名(换成保留站的标识)和对操作数进行了缓冲,消除了WAR冲突。另外,还要完成对目的寄存器的预约工作,将之设置为接收保留站 rrr 的结果。这实际上相当于提前完成了写操作(预约)。由于指令是按程序顺序流出的,当出现多条指令写同一个结果寄存器时,最后留下的预约结果肯定是最后一条指令的,就是说消除了 WAW 冲突。
当然,如果没有空闲的保留站,指令就不能流出,这是发生了结构冲突。

(2)执行。

如果某个操作数还没有计算出来,本保留站将监视 CDB,等待所需的计算结果。一旦那个结果产生,它就被放到 CDB 上,本保留站将立即获得该数据。当两个操作数都就绪后,本保留站就用相应的功能部件开始执行指令规定的操作。这里是等到所有操作数都备齐后才开始执行指令,也就是说是靠推迟执行的方法解决 RAW 冲突的。由于结果数据是从其产生的部件(保留站)直接送到需要它的地方,所以这已经是最大限度地减少了 RAW 冲突的影响。
显然,保留站有可能会出现多条指令在同一时钟周期完成就绪的情况。不同的功能部件可以并行执行,但在一个功能部件内部,就绪的多条指令就得逐条地处理。可以采用随机的方法选择要执行的指令。
load 和 store 指令的执行需要两个步骤:计算有效地址(要等到基地址寄存器就绪)和把有效地址放入 load 和 store 缓冲器。load缓冲器中的load指令的执行条件是存储器部件就绪。而store缓冲器中的store指令在执行前必须等到要存入存储器的数据到达。通过按顺序进行有效地址计算来保证程序顺序,这有助于避免访问存储器的冲突。
(3)写结果
功能部件计算完毕后,就将计算结果放到 CDB 上,所有等待该计算结果的寄存器和保留站(包括 store 缓冲器)都同时从 CDB 上获取所需要的数据。

每个保留站有以下7个字段:
OpO_pOp​:要对源操作数进行的操作
Qj,QkQ_j, Q_kQj​,Qk​:将产生源操作数的保留站号,等于0表示操作数已经就绪且在VjV_jVj​或VkV_kVk​中,或者不需要操作数
Vj,VkV_j, V_kVj​,Vk​:源操作数的值,对于每一个操作数来说,VVV或QQQ字段只有一个有效。
BusyBusyBusy:为“yesyesyes”表示本保留站或缓冲单元“忙”
AAA:仅 loadloadload 和 storestorestore 缓冲器有该字段。开始是存放指令中的立即数字段,地址计算后存放有效地址。
QiQ_iQi​:寄存器状态表,每个寄存器在该表中有对应的一项,用于存放将把结果写入该寄存器的保留站的站号。为0表示当前没有正在执行的指令要写入该寄存器,也即该寄存器中的内容就绪。

具体算法

各符号的意义
rrr:分配给当前指令的保留站或者缓冲器单元编号;
rdrdrd:目的寄存器编号;
rs,rtrs,rtrs,rt:操作数寄存器编号;
immimmimm:符号扩展后的立即数;
RSRSRS:保留站;
resultresultresult:浮点部件或loadloadload缓冲器返回的结果;
QiQ_iQi​:寄存器状态表;
Regs[]Regs[]Regs[]:寄存器组;
OpOpOp:当前指令的操作码.
对于 load 指令来说,rtrtrt 是保存所取数据的寄存器号,对于 store 指令来说,rtrtrt 是保存所要存储的数据的寄存器号。与 rsrsrs 对应的保留站字段是 VjV_jVj​,QjQ_jQj​;与 rtrtrt 对应的保留站字段是 VkV_kVk​,QkQ_kQk​.
请注意:QiQ_iQi​、QjQ_jQj​、QkQ_kQk​ 的内容或者为0,或者是一个大于0的整数。QiQ_iQi​为0表示相应寄存器中的数据就绪,QjQ_jQj​、QkQ_kQk​ 为 0 表示保留站或缓冲器单元中的 VjV_jVj​ 或 VkV_kVk​ 字段中的数据就绪。当它们为正整数时,表示相应的寄存器、保留站或缓冲器单元正在等待结果。这个正整数就是产生该结果的保留站或 load 缓冲器单元的编号。

  1. 指令流出
    (1)浮点运算指令
    (2)load 和 store 指令
  2. 执行
    (1)浮点运算指令
    (2)load 和 store 指令
  3. 写结果
    (1)浮点运算指令和 load 指令
    (2)store 指令

总结:Tomasulo 算法的三个阶段

  • Issue——发射:从浮点操作队列取指令
    保留站空闲(no structural hazard),
    控制发射指令 & 发送操作数(renames registers)-- WAR
  • Execute——执行
    操作数就绪,开始执行
    若没有就绪,检测 CDB,等待结果
  • Write result——执行完成
    写结果到 CDB
    置保留站空闲

正常总线:data + destination (“go to” 总线)
CDB: data + source (“come from” 总线)

示例

假设 load 操作的延迟是 2 个时钟周期;浮点“+,-“的延迟是 2 个时钟周期;浮点”*“的延迟是 10 个时钟周期;浮点”/"的延迟是40个时钟周期。

指令相关图
初始状态:
cycle 1
cycle 2
cycle 3
cycle 4
cycle 5
cycle 6
cycle 7
cycle 8
cycle 10
cycle 11
cycle 15
cycle 16

cycle 56
cycle 57

Loop 示例

初始状态:
cycle 1
cycle 2
cycle 3
cycle 4
cycle 5
cycle 6
cycle 7
cycle 8
cycle 9
cycle 10
cycle 11
cycle 12
cycle 13
cycle 14
cycle 15
cycle 16
cycle 17
cycle 18
cycle 19
cycle 20
为什么 Tomasulo 可以实现循环间并行?

  • 寄存器重命名
    动态循环展开 loop unrolling

  • 保留站
    循环浮点指令发射先于整数控制流
    避免 WAR 引起的停顿(如 scorebord)

  • Tomasulo 算法在运行中维护数据相关性

计算机系统结构:指令的动态调度-Tomasulo算法相关推荐

  1. 计算机系统结构:指令的动态调度-记分牌算法

    记分牌算法和Tomasulo算法是两种比较典型的动态调度算法.记分牌算法历史现在仍在某些地方根据需求被使用.Tomasulo算法已经比计分牌算法改进了许多,是一种更强的算法.许多开发指令级并行的现代处 ...

  2. 计算机体系结构--Tomasulo算法

    起源 由IBM开发,并于1966年在IBMS360/91大型机中首次实现,大约是在CDC6600中记分板首次亮相之后的3年. 动态调度硬件中的流水线,减少停顿. 结构 Tomasulo与记分牌 提起T ...

  3. 一个计算机系统采用32位单字节指令,(自考02325李学干版)计算机系统结构课后习题.doc...

    课 后 习 题 第一章 计算机系统结构的基本概念 1.有一个计算机系统可按功能分成4级,每级的指令互不相同,每一级的指令都比其下一级的指令在效能上强M倍,即第i级的一条指令能完成第i-1级的M条指令的 ...

  4. 计算机系统结构 网易云课堂,计算机系统结构 (三) CPU及其结构分析

    本部分是计算机系统结构课程的核心课程,介绍计算机核心结构CPU的体系结构及提高系统性能的核心技术和方法.掌握在计算机CPU设计环节中影响性能的因素,以及提高CPU性能的理论和方法,通过定量分析技术对设 ...

  5. 网易云课堂计算机体系,计算机系统结构 (三) CPU及其结构分析

    本部分是计算机系统结构课程的核心课程,介绍计算机核心结构CPU的体系结构及提高系统性能的核心技术和方法.掌握在计算机CPU设计环节中影响性能的因素,以及提高CPU性能的理论和方法,通过定量分析技术对设 ...

  6. 结构计算机分析,计算机系统结构 (三) CPU及其结构分析

    本部分是计算机系统结构课程的核心课程,介绍计算机核心结构CPU的体系结构及提高系统性能的核心技术和方法.掌握在计算机CPU设计环节中影响性能的因素,以及提高CPU性能的理论和方法,通过定量分析技术对设 ...

  7. 计算机系统结构循环间相关,计算机系统结构(双语)

    全部展开 计算机体系结构2113是5261计算机科学与技术,软件工程等行业的核心课程之一. 4102专注于计算机系统的基本1653结构,设计技术和性能分析方法. 通过本课程,您将了解计算机系统的各种基 ...

  8. 【计算机组成原理】计算机系统结构笔记:合集

    200803本篇是郑纬民<计算机系统结构>的读书笔记,欢迎各位路过指正!今天把九章全部更新完毕啦. 0. 分章节目录 [计算机组成原理]计算机系统结构笔记(1):基本概念 [计算机组成原理 ...

  9. 电子科技大学-高级计算机系统结构

    第1章 量化设计与分析基础 1. 计算机的分类类别 2. 计算机系统结构定义和计算机的设计任务:指令集结构概念及要素 ISA(指令集结构): 硬件与软件之间的接口 用途: 开发者与硬件之间的接口 这代 ...

  10. 计算机系统结构复习(五):ILP指令集并行

    计算机系统结构复习(五):ILP指令集并行 指令集并行和两种方式 基本快 相关与从冲突的关系 循环展开 循环展开的注意事项 动态分支预测 动态分支预测与静态分支预测的区别 分支历史表BHT 一位分支历 ...

最新文章

  1. 基于深度学习的医学图像半监督分割
  2. linux centos7怎么绑定多ip,003 Linux配置多ip绑定的方法 | ip别名(以CentOS7为例 )
  3. C# “不支持给定路径的格式”异常处理
  4. vim 居中光标所在行(转载)
  5. Flex【原创】Xml与Object互转/读写本地Xml文件
  6. 摘抄:微软 Dynamics AX 学习步骤
  7. 为什么农村出来的大学生大多混得比较差?
  8. 格力发布2021年中期利润分配预案:每10股派发现金股利10元
  9. python高中题_python练习题
  10. 第一阶段:Java基础
  11. 《joel说软件》读书笔记
  12. Google Adsense西联汇款领取方式与流程,亲身实践,供参考
  13. Linux系统MySQL自动备份
  14. 容联与腾讯云牵手!这一合作背后有何深意?
  15. LuoguP1710 地铁涨价
  16. linux yum安装redis
  17. 爬虫利器:Python获取免费IP代理
  18. 有道技术团队入选 2021思否中国技术先锋年度评选两项榜单
  19. jQuery.validationEngine插件使用
  20. 解决realplay在ubuntu中没有声音且画面很卡的问题

热门文章

  1. 企业邮箱怎样申请注册?
  2. iOS_21团购_拼音搜索
  3. 面向稀有事件的 Logistic Regression 模型校准
  4. PHP的implode函数运用,什么是PHP中的implode()函数?
  5. MADlib——基于SQL的数据挖掘解决方案(7)——数据转换之其它转换
  6. Pytorch介绍以及基本使用
  7. linux kobject 原理,Linux设备驱动模型 - kobject原理与实例分析_Linux编程_Linux公社-Linux系统门户网站...
  8. ARPG游戏的战斗系统设计
  9. v3.exo是什么文件_exo是什么文件?
  10. 拓扑图绘制工具开源_3个用于绘制家谱的开源家谱工具