HNU_CA_作业5-总复习作业 2

一、题目1-流水线 CPI 的优化技术

总结指令流水线 CPI 的优化技术, 如基于硬件还是软件,主要思想,对应了流水线 CPI 公式的哪个分量等。

现代处理器通过流水线来实现指令级并行(ILP),提高性能。流水化处理器的CPI为:
流水线 CPI = 理想流水线 CPI + 结构化冒险停顿 + 数据冒险停顿 + 控制冒险停顿

停顿的单位是每条指令。主要的ILP技术有:

技术降低CPI的哪一部分基于硬件/软件
前推、转发数据冒险停顿硬件
基本动态调度(记分牌)数据冒险停顿硬件
采用重命名的动态调度(Tomasulo)数据冒险停顿硬件
延迟分支和基本分支预测控制冒险停顿硬件
动态分支预测控制冒险停顿硬件
循环展开控制冒险停顿软件
编译器流水线调度数据冒险停顿软件

二、题目2-RAW,WAW,WAR,寄存器重命名

简单描述什么是真数据依赖(True data dependence),输出依赖(Output dependence), 反依赖(Antidependence), 寄存器重命名(Register renaming)

  • 真数据依赖/流依赖 True data /flow dependence【RAW】
    • S1定义了一个值,随后S2使用了这个值。
      记作 S 1   δ f   S 2 记作 S1\ \delta^f\ S2 记作S1 δf S2
    • 举例:值-a
a = b + c  // S1
d = a + c  // S2
  • 输出依赖(Output dependence)【WAW】
    • 两个语句都定义了一个值。
      记作 S 1   δ o   S 2 记作S1\ \delta^o \ S2 记作S1 δo S2
    • 举例:值-a
a = b + c  // S1
a = d     // S2
  • 反依赖(Antidependence)【WAR】
    • S1使用了一个值,而随后S2定义了这个值。
      记作 S 1   δ a   S 2 记作S1\ \delta^a \ S2 记作S1 δa S2
    • 举例:值-b
a = b + c  // S1
b = c + d  // S2
  • 输入依赖(Output dependence)【RAR】
    • 两个语句都使用了一个值。
      记作 S 1   δ i   S 2 记作S1\ \delta^i \ S2 记作S1 δi S2
    • 举例:值-b
a = b + c  // S1
d = b + 2  // S2
  • 寄存器重命名(Register renaming
    • 作用
      • 消除假数据冒险:WAR,WAW)
      • 当指令执行发生错误而取消时,后面的指令时可以保证现场的精确
    • 思路
      • 当一条指令写结果寄存器时,不直接写入,而是先写到一个中间寄存器过渡一下
      • 当这条指令提交时,再写到结果寄存器中
    • 方法
      • 使用重排序缓冲(Reorder Buffer,ROB)来实现;
      • 将逻辑寄存器(Architecture Register File,ARF)扩展来实现;
      • 使用统一的物理寄存器(Physical Register File,PRF)来实现寄存器重命名。

三、题目3-Cache

3.1 标签(tag)、缓存索引(cache index) 和块偏移(block offset)的位数

请回答下列关于 cache 的问题
(1)一个计算机系统用 32 位内存地址。它有 128KB 8 路组相联缓存, 每个块 大小为 64B。计算标签(tag)、缓存索引(cache index) 和块偏移(block offset)的位数。

  • 块偏移(block offset):64=26—>6位
  • 缓存索引(cache index):128KB/(8*64B)=217/(23*26)=28—>8位
  • 标签(tag):32-6-8=18位

ANSWER:

  • 块偏移 6位 2^6=64
  • 缓存索引 8位 2^8= 128KB/(64B*8)=256
  • 计算标签 18位 18=32-6-8

3.2 缓存命中、不命中

(2)处理器有一个小型直接映射缓存, 能够容纳四个缓存块。
内存是按字节 寻址的, 每个缓存块由 32 字节组成。
处理器使用 12 位内存地址。 假设每个
缓存块的初始标签值如下:

标签
0000110
0100001
1000000
11Invalid

处理器从以下十进制地址顺序读取数据: 32, 48, 64, 128
对于上述每个地址,指出缓存访问将导致命中还是未命中。 并给出详细过程。

  • ( S , E,B,m)–>(2,1,5,12)
    • b-块偏移(block offset):32=25—>5位
    • s-缓存索引(cache index):4)==22—>2位
    • (m-s-b)-标签(tag):12-5-2=5位
  • 读32–未命中
    • 32=0b10 0000=0b01 00000:tag=00000,cache index=01,offset=00000;
    • 与缓存中块01的tag-00001不匹配,故不命中;
    • 替换操作后块01,标签00000
  • 读48–命中
    • 48=0b11 0000=0b01 10000:tag=00000,cache index=01,offset=10000;
    • 与缓存中块1的tag匹配(读32不命中后替换了之前的块1),故命中;
  • 读64–命中
    • 64=0b100 0000=0b10 00000:tag=00000,cache index=10,offset=00000;
    • 与缓存中块10的tag-00000匹配,故命中;
  • 读128–不命中
    • 128=0b1000 0000=0b1 00 00000:tag=00001,cache index=00,offset=00000;
    • 与缓存中块00的tag-00110匹配,故不命中;
    • 替换操作后块00,标签00001

ANSWER:

  • 地址32 块索引为01 标签为00000 未命中
  • 地址48 块索引为01 标签为00000 命中(上一步发生了替换)
  • 地址64 块索引为10 标签为00000 命中
  • 地址128 块索引为00 标签为00001 未命中

四、内存访问时间与 cache

4.1 平均内存访问时间公式,6种缓冲优化技术

(1)简述平均内存访问时间公式,总结附录 B 的 6 种缓冲优化技术。

  • 平均内存访问时间公式
    • 平均内存访问时间 = 命中时间 + 缺失率 x 缺失代价
    • 缺失:
      • 冷不命中:首次访问一个块时缺失【增大块的大小,但可能增加其他的缺失】
      • 容量不命中:缓存的所有行均已满时发生丢失【增大缓存】
      • 冲突不命中:Cache中仍有空行,主内存块与Cache中已填充的行发生冲突(即使有可用的空位,该块也试图占用已填充的行);冒险缺失会随相联度的增大而减小【采用全相联,但硬件实现成本高,可能降低处理器时间频率】
  • 6种缓冲优化技术
技术目的衡量折中
增大块大小降低缺失率降低冷不命中;更好利用空间局部性增加容量不命中、冲突不命中的代价低级存储器为高带宽、高延迟:大块;低带宽、低延迟:小块
增大缓存降低缺失率降低容量不命中可能延长命中时间,增加成本和功耗
提高相联度降低缺失率降低冲突不命中提高缺失代价经验规律:采用八路组相联和全相联一样有效
多级缓存降低缺失代价加快缓存速度,扩大缓存容量二级缓存的缺失率更高,偏向减少缺失,采用更高相联度和更大的块
读缺失优先于写缺失减少命中时间对于RAW,若未写完、还在写入缓冲区,则让读缺失先检查写入缓冲区的内容
索引缓存时避免地址转换减少命中时间缓存中使用物理地址少部分计算采用:地址空间保护等原因一部分页偏移量索引缓存,标志匹配采用物理地址–>索引读取缓存的同时,进行地址的转换

4.2 平均内存访问时间、(不)使用cache的平均 CPI

(2)计算题:假设存在一个计算机, CPI 是 2(没有储存器停顿(Memory stalls)),仅有载入/储存指令进行数据访问,并且载入/储存的指令的占比是 36%。
假如缺失代价(Miss penalty)是 40 个时钟周期,指令缓存缺失率 (Instruction miss rate)是 2%, 数据缓存缺失率(Data miss rate)是 4%。
请计算平均内存访问时间、不使用 cache 技术的 CPU 的平均 CPI,和使用了 cache技术获得的加速比。

  • 1)指令缓存和数据缓存平均内存访问时间

    • 命中时间=0(注:这里因为《作业三》的该题题目中有给出“命中时间为0” 作业三
    • 指令缓存缺失率=2%, 数据缓存缺失率= 4%
    • 缺失代价=40个时钟周期
    • 指令缓存平均内存访问时间:0+0.02*40=0.8 (个时钟周期)
    • 数据缓存平均内存访问时间:0+0.04*40=1.6(个时钟周期)
  • 2)不使用 cache 技术的 CPU 的平均 CPI(等同miss rate 100%)

    • 没有储存器停顿的CPI:2
    • 缺失周期:指令缓存不命中+数据缓存不命中
      • 因为指令缓存不命中的缺失周期:IC*1*40=IC*40
      • 因为数据缓存不命中的缺失周期:IC*0.36*1*40=IC*14.4
    • 平均CPI:2+40+14.4=56.4
  • 3)使用了 cache 技术相对无 cache 计算机获得的加速比

    • 有Cache的平均CPI:
      • 没有储存器停顿的CPI:2
      • 缺失周期:指令缓存不命中+数据缓存不命中
        • 因为指令缓存不命中的缺失周期:IC*0.02*40=IC*0.8
        • 因为数据缓存不命中的缺失周期:IC*0.36*0.04*40=IC*0.576
    • 平均CPI:2+0.8+0.576=3.376
    • 加速比: 56.4/3.376=16.7
  • 解答的依据

ANSWER:

  • 指令缓存的内存访问时间=0+40*0.02=0.8CC
  • 数据缓存的内存访问时间=0+40*0.04=1.6CC
  • 无cacheCPI=2+40+40*0.36=56.4
  • 有cacheCPI=2+40*0.02+40*0.04*0.36=3.376
  • 加速比=56.4/3.376=16.7
  • 在这里插入图片描述

五、高速缓存的地址解析

5.1 写分配、写回和直接映射缓存

a)考虑具有 32 字节块和2^19 字节的数据的写分配、写回和直接映射缓存。
假设一个字节寻址机器有 32 位地址

1)以下地址位分配的每个字段的宽度是多少

TAGSet indexBlock offset
32-14-5=1319-5=145

2)构成缓存的总位数是多少(数据和缓存管理)?请给出计算过程。
2024/5/19更:增加了“有效位”的考虑
2024/5/20更:因为写回,增加了“脏位”的考虑
缓存总位数 = 缓存行数 × ( 脏位 + 有效位 + T A G 位数 + 数据位数 ) = 2 14 ∗ ( 1 + 1 + 13 + 32 ∗ 8 ) = 2 14 ∗ ( 15 + 256 ) 缓存总位数 = 缓存行数 × (脏位+有效位+TAG 位数 + 数据位数) \\ =2^{14}*(1+1+13+32*8)=2^{14}*(15+256) 缓存总位数=缓存行数×(脏位+有效位+TAG位数+数据位数)=2141+1+13+328=21415+256

说明

  • 一般的,每行都需要有Valid、Tag、Block:

    • 行匹配时,会检查valid和Tag在这里插入图片描述
    • 在这里插入图片描述
    • 在这里插入图片描述
  • 写回,需要增加一个脏位,用于判断写回时是否更新主存内容
    -在这里插入图片描述

5.2 单级、 1KB 直接映射L1缓存

b)假设有一个单级、 1KB 直接映射L1缓存和 16 字节块。有 4GB的内存。
一个整数是 4 字节。数组是块对齐的.

1)计算L1缓存中的标签(tag)、索引(index)和偏移位(offset bits)的个数

TAGSet indexBlock offset
32-10=2210-4= 64

六、Tomasulo 算法与记分牌算法

简述下图各个主要部件的功能。填写 Tomasulo 算法与记分牌的运行状态表, 讲述两者异同。

在这里插入图片描述

对于以下代码序列,写出各个周期运行时状态 (信息表已给出):
fld f6, 32(× 2)
fld f2, 44(× 3)
fmul. df0, f2, f4
fsub. df8, f2, f4
fdiv. df8, f0, f6
fadd. df6, f8, f2

(1)简述各个主要部件的功能

①记分牌算法

  • Registers:寄存器堆;操作数寄存器( OPRAND )、结果寄存器( RESULT )
    • 与FP、Integer unit相连的操作数/结果寄存器,通过数据总线Data Buses传递数据;
    • 与Scoreboard相连的寄存器,控制数据冒险(WAR)
  • FP、Integer unit:运算单元;接收两个操作数,结果通过数据总线Data Buses写回寄存器
  • Scoreboard记分牌:控制数据冒险(WAR)
    • 另外,上面没有解码单元:其和记分牌的交互是指解码单元要“问”记分牌当前指令是否有“ WAW 冒险”和“ Structure 结构冒险”,如果没有,指令就可以顺利渡过当前的阶段;
    • 上面也没有部件寄存器(即 MUL_1 这一列),处理数据冒险RAW
  • 另外,上面没有指令寄存器
    在这里插入图片描述
    ANSWER:
    在这里插入图片描述

②Tomasulo算法

  • FP OP Queue【Instruction queue】:指令队列,指令在这里等待发射;
  • FP adders/multipilers:加法单元、乘法单元
  • Reservation:加法单元、乘法单元的保留站(保留已经发射的指令的信息和缓冲下来的数据);
  • Address Unit:地址计算单元;在这个算法中存储指令在执行前会先计算好存储地址;
  • Memory Unit:存储单元;
  • CDB:数据广播总线,它可以直达寄存器堆(用来更新通用寄存器)、加法乘法存储单元的保留站(输送保留站中指令需要的数据)。
  • FP registers:寄存器堆
    在这里插入图片描述
    ANSWER:
    在这里插入图片描述

(2)计分牌运行状态表:

1)周期1

Load指令对应的功能部件空闲,且指令要写的目标寄存器f6没有别的指令将要写(避免WAW 冒险);
那么发射阶段结束时,就可以把指令信息存进部件寄存器,同时改写记分牌,把指令相关信息计入记分牌。
指令状态

指令发射读操作数执行写回
fld f6, 32(× 2)√1
fld f2, 44(× 3)
fmul.d f0, f2, f4
fsub.d f8, f2, f4
fdiv.d f8, f0, f6
fadd.d f6, f8, f2

保留站

名称BusyopFiFjFKQjQKRjRK
IntegerYesLoadf6x2Yes
Add1No
Add2No
Add3No
Mult1No
Mult2No

寄存器状态

字段f0f2f4f6f8f10f12∙ ∙ ∙f30
QiInteger
Val

2)周期2

  • 寄存器x2可以读取
  • 指令2对应的功能部件不空闲,延迟发射

指令状态

指令发射读操作数执行写回
fld f6, 32(× 2)√1√2
fld f2, 44(× 3)
fmul.d f0, f2, f4
fsub.d f8, f2, f4
fdiv.d f8, f0, f6
fadd.d f6, f8, f2

保留站

名称BusyopFiFjFKQjQKRjRK
IntegerYesLoadf6x2Yes
Add1No
Add2No
Add3No
Mult1No
Mult2No

寄存器状态

字段f0f2f4f6f8f10f12∙ ∙ ∙f30
QiInteger
Val

3)周期3

R读完设成No
在这里插入图片描述

指令状态

指令发射读操作数执行写回
fld f6, 32(× 2)√1√2√3
fld f2, 44(× 3)
fmul.d f0, f2, f4
fsub.d f8, f2, f4
fdiv.d f8, f0, f6
fadd.d f6, f8, f2

保留站

名称BusyopFiFjFKQjQKRjRK
IntegerYesLoadf6x2No
Add1No
Add2No
Add3No
Mult1No
Mult2No

寄存器状态

字段f0f2f4f6f8f10f12∙ ∙ ∙f30
QiInteger
Val

4)周期4

写回周期结束时,把结果写回到寄存器堆,同时清空记分牌中的信息。

指令状态

指令发射读操作数执行写回
fld f6, 32(× 2)√1√2√3√4
fld f2, 44(× 3)
fmul.d f0, f2, f4
fsub.d f8, f2, f4
fdiv.d f8, f0, f6
fadd.d f6, f8, f2

保留站

名称BusyopFiFjFKQjQKRjRK
IntegerNo
Add1No
Add2No
Add3No
Mult1No
Mult2No

寄存器状态

字段f0f2f4f6f8f10f12∙ ∙ ∙f30
Qi
ValM【32+x2】

5)周期5

Load指令对应的功能部件空闲,且指令要写的目标寄存器f2没有别的指令将要写(避免WAW 冒险);
那么发射阶段结束时,就可以把指令信息存进部件寄存器,同时改写记分牌,把指令相关信息计入记分牌。

指令状态

指令发射读操作数执行写回
fld f6, 32(× 2)√1√2√3√4
fld f2, 44(× 3)√5
fmul.d f0, f2, f4
fsub.d f8, f2, f4
fdiv.d f8, f0, f6
fadd.d f6, f8, f2

保留站

名称BusyopFiFjFKQjQKRjRK
IntegerYesLoadf2x3Yes
Add1No
Add2No
Add3No
Mult1No
Mult2No

寄存器状态

字段f0f2f4f6f8f10f12∙ ∙ ∙f30
QiInteger
ValM【32+x2】

6)周期6

  • mul指令对应的功能部件空闲,且指令要写的目标寄存器f0没有别的指令将要写(避免WAW 冒险);
    • 源操作数:把f2-Integer存进部件寄存器
    • 目的操作数:改写记分牌,把指令相关信息Mult1计入记分牌f0。
  • 第二条Load指令读操作数

指令状态

指令发射读操作数执行写回
fld f6, 32(× 2)√1√2√3√4
fld f2, 44(× 3)√5√6
fmul.d f0, f2, f4√6
fsub.d f8, f2, f4
fdiv.d f8, f0, f6
fadd.d f6, f8, f2

保留站

名称BusyopFiFjFKQjQKRjRK
IntegerYesLoadf2x3Yes
Add1No
Add2No
Add3No
Mult1Yesmulf0f2f4IntegerNoYes
Mult2No

寄存器状态

字段f0f2f4f6f8f10f12∙ ∙ ∙f30
QiMult1Integer
ValM【32+x2】

7)周期7

  • sub指令对应的功能部件空闲,且指令要写的目标寄存器f8没有别的指令将要写(避免WAW 冒险);
    • 源操作数:把f2-Integer存进部件寄存器
    • 目的操作数:改写记分牌,把指令相关信息Add1计入记分牌f8。
  • 第二条Load指令读操作数完成,Rk设为No
  • mul指令操作数未准备好,卡在部件寄存器中(避免RAW 冒险)

指令状态

指令发射读操作数执行写回
fld f6, 32(× 2)√1√2√3√4
fld f2, 44(× 3)√5√6√7
fmul.d f0, f2, f4√6
fsub.d f8, f2, f4√7
fdiv.d f8, f0, f6
fadd.d f6, f8, f2

保留站

名称BusyopFiFjFKQjQKRjRK
IntegerYesLoadf2x3No
Add1Yessubf8f2f4IntegerNoYes
Add2No
Add3No
Mult1Yesmulf0f2f4IntegerNoYes
Mult2No

寄存器状态

字段f0f2f4f6f8f10f12∙ ∙ ∙f30
QiMult1IntegerAdd1
ValM【32+x2】

8)周期8

  • div指令对应的功能部件空闲,但是指令要写的目标寄存器f8有别的指令sub将要写(避免WAW 冒险);延迟发射
  • 第二条Load指令写回,周期结束时,把结果写回到寄存器堆,同时清空记分牌中的信息。
  • 删除保留站中的因为fld阻塞的Add1、Mult1的Qj–Integer,Rj设为Yes

指令状态

指令发射读操作数执行写回
fld f6, 32(× 2)√1√2√3√4
fld f2, 44(× 3)√5√6√7√8
fmul.d f0, f2, f4√6
fsub.d f8, f2, f4√7
fdiv.d f8, f0, f6
fadd.d f6, f8, f2

保留站

名称BusyopFiFjFKQjQKRjRK
IntegerNo
Add1Yessubf8f2f4YesYes
Add2No
Add3No
Mult1Yesmulf0f2f4YesYes
Mult2No

寄存器状态

字段f0f2f4f6f8f10f12∙ ∙ ∙f30
QiMult1Add1
ValM【44+x3】M【32+x2】

9)周期9

  • mul、sub指令读操作数;
  • sub指令执行周期为2,sub指令执行周期为10

指令状态

指令发射读操作数执行写回
fld f6, 32(× 2)√1√2√3√4
fld f2, 44(× 3)√5√6√7√8
fmul.d f0, f2, f4√6√9
fsub.d f8, f2, f4√7√9
fdiv.d f8, f0, f6
fadd.d f6, f8, f2

保留站

名称BusyopFiFjFKQjQKRjRK
IntegerNo
2 Add1Yessubf8f2f4YesYes
Add2No
Add3No
10 Mult1Yesmulf0f2f4YesYes
Mult2No

寄存器状态

字段f0f2f4f6f8f10f12∙ ∙ ∙f30
QiMult1Add1
ValM【44+x3】M【32+x2】

10)周期10

  • mul、sub指令读操作数完成,Rj、Rk设为No
  • sub指令执行周期还差1,mul指令执行周期还差9

指令状态

指令发射读操作数执行写回
fld f6, 32(× 2)√1√2√3√4
fld f2, 44(× 3)√5√6√7√8
fmul.d f0, f2, f4√6√910
fsub.d f8, f2, f4√7√910
fdiv.d f8, f0, f6
fadd.d f6, f8, f2

保留站

名称BusyopFiFjFKQjQKRjRK
IntegerNo
1 Add1Yessubf8f2f4NoNo
Add2No
Add3No
9 Mult1Yesmulf0f2f4NoNo
Mult2No

寄存器状态

字段f0f2f4f6f8f10f12∙ ∙ ∙f30
QiMult1Add1
ValM【44+x3】M【32+x2】

11)周期11

  • sub指令执行完成,mul指令执行周期还差8

指令状态

指令发射读操作数执行写回
fld f6, 32(× 2)√1√2√3√4
fld f2, 44(× 3)√5√6√7√8
fmul.d f0, f2, f4√6√911
fsub.d f8, f2, f4√7√9√11
fdiv.d f8, f0, f6
fadd.d f6, f8, f2

保留站

名称BusyopFiFjFKQjQKRjRK
IntegerNo
Add1Yessubf8f2f4NoNo
Add2No
Add3No
8 Mult1Yesmulf0f2f4NoNo
Mult2No

寄存器状态

字段f0f2f4f6f8f10f12∙ ∙ ∙f30
QiMult1Add1
ValM【44+x3】M【32+x2】

12)周期12

  • sub指令写回;周期结束时,把结果写回到寄存器堆,同时清空记分牌中的信息。
  • mul指令执行周期还差7

指令状态

指令发射读操作数执行写回
fld f6, 32(× 2)√1√2√3√4
fld f2, 44(× 3)√5√6√7√8
fmul.d f0, f2, f4√6√912
fsub.d f8, f2, f4√7√9√11√12
fdiv.d f8, f0, f6
fadd.d f6, f8, f2

保留站

名称BusyopFiFjFKQjQKRjRK
IntegerNo
Add1No
Add2No
Add3No
7 Mult1Yesmulf0f2f4NoNo
Mult2No

寄存器状态
假设f4中的值初始为F4

字段f0f2f4f6f8f10f12∙ ∙ ∙f30
QiMult1
ValM【44+x3】F4M【32+x2】M【44+x3】- F4

13)周期13

  • div指令对应的功能部件空闲,且指令要写的目标寄存器f8没有别的指令将要写(避免WAW 冒险);
    • 源操作数:把f0-Mult1存进部件寄存器
    • 目的操作数:改写记分牌,把指令相关信息Mult2计入记分牌f8。
  • mul指令执行周期还差6

指令状态

指令发射读操作数执行写回
fld f6, 32(× 2)√1√2√3√4
fld f2, 44(× 3)√5√6√7√8
fmul.d f0, f2, f4√6√913
fsub.d f8, f2, f4√7√9√11√12
fdiv.d f8, f0, f6√13
fadd.d f6, f8, f2

保留站

名称BusyopFiFjFKQjQKRjRK
IntegerNo
Add1No
Add2No
Add3No
6 Mult1Yesmulf0f2f4NoNo
Mult2Yesdivf8f0f6Mult1NoYes

寄存器状态

字段f0f2f4f6f8f10f12∙ ∙ ∙f30
QiMult1Mult2
ValM【44+x3】F4M【32+x2】M【44+x3】- F4

14)周期14

  • add指令对应的功能部件空闲,且指令要写的目标寄存器f6没有别的指令将要写(避免WAW 冒险);
    • 源操作数:把f0-Mult1存进部件寄存器
    • 目的操作数:改写记分牌,把指令相关信息Mult2计入记分牌f8。
  • mul指令执行周期还差5

指令状态

指令发射读操作数执行写回
fld f6, 32(× 2)√1√2√3√4
fld f2, 44(× 3)√5√6√7√8
fmul.d f0, f2, f4√6√914
fsub.d f8, f2, f4√7√9√11√12
fdiv.d f8, f0, f6√13
fadd.d f6, f8, f2√14

保留站

名称BusyopFiFjFKQjQKRjRK
IntegerNo
Add1Yesaddf6f8f2Mult2NoYes
Add2No
Add3No
5 Mult1Yesmulf0f2f4NoNo
Mult2Yesdivf8f0f6Mult1NoYes

寄存器状态

字段f0f2f4f6f8f10f12∙ ∙ ∙f30
QiMult1Add1Mult2
ValM【44+x3】F4M【32+x2】M【44+x3】- F4

15)周期19

  • mul指令执行周期还差4(周期15),3(周期16),2(周期17),1(周期18);
  • 周期19执行完成

指令状态

指令发射读操作数执行写回
fld f6, 32(× 2)√1√2√3√4
fld f2, 44(× 3)√5√6√7√8
fmul.d f0, f2, f4√6√9√19
fsub.d f8, f2, f4√7√9√11√12
fdiv.d f8, f0, f6√13
fadd.d f6, f8, f2√14

保留站

名称BusyopFiFjFKQjQKRjRK
IntegerNo
Add1Yesaddf6f8f2Mult2NoYes
Add2No
Add3No
Mult1Yesmulf0f2f4NoNo
Mult2Yesdivf8f0f6Mult1NoYes

寄存器状态

字段f0f2f4f6f8f10f12∙ ∙ ∙f30
QiMult1Add1Mult2
ValM【44+x3】F4M【32+x2】M【44+x3】- F4

16)周期20

  • mul指令写回;周期结束时,把结果写回到寄存器堆,同时清空记分牌中的信息。
  • 因Mult1阻塞的Mult2,在保留站中,删除Qj的Mult1,且Rj设为Yes

指令状态

指令发射读操作数执行写回
fld f6, 32(× 2)√1√2√3√4
fld f2, 44(× 3)√5√6√7√8
fmul.d f0, f2, f4√6√9√19√20
fsub.d f8, f2, f4√7√9√11√12
fdiv.d f8, f0, f6√13
fadd.d f6, f8, f2√14

保留站

名称BusyopFiFjFKQjQKRjRK
IntegerNo
Add1Yesaddf6f8f2Mult2NoYes
Add2No
Add3No
Mult1No
Mult2Yesdivf8f0f6YesYes

寄存器状态

字段f0f2f4f6f8f10f12∙ ∙ ∙f30
QiAdd1Mult2
ValM【44+x3】*F4M【44+x3】F4M【32+x2】M【44+x3】- F4

17)周期21-【更正】

  • div指令读操作数;
    • f0:M【44+x3】/F4
    • f6:M【32+x2】;之所以不用等待寄存器状态表中的f6的Qi–Add1,是因为读操作数的时候div指令的Rj,Rk为Yes,直接从寄存器状态表中的val读即可
  • div指令执行需周期10;【更正为40】

指令状态

指令发射读操作数执行写回
fld f6, 32(× 2)√1√2√3√4
fld f2, 44(× 3)√5√6√7√8
fmul.d f0, f2, f4√6√9√19√20
fsub.d f8, f2, f4√7√9√11√12
10-【更正为40】 fdiv.d f8, f0, f6√13√21
fadd.d f6, f8, f2√14

保留站

名称BusyopFiFjFKQjQKRjRK
IntegerNo
Add1Yesaddf6f8f2Mult2NoYes
Add2No
Add3No
Mult1No
Mult2Yesdivf8f0f6YesYes

寄存器状态

字段f0f2f4f6f8f10f12∙ ∙ ∙f30
QiAdd1Mult2
ValM【44+x3】*F4M【44+x3】F4M【32+x2】M【44+x3】- F4

18)周期22-【更正】

  • div指令读操作数完成;Rj、Rk设为No
  • div指令执行需周期9;【更正为39】

指令状态

指令发射读操作数执行写回
fld f6, 32(× 2)√1√2√3√4
fld f2, 44(× 3)√5√6√7√8
fmul.d f0, f2, f4√6√9√19√20
fsub.d f8, f2, f4√7√9√11√12
9【更正为39】 fdiv.d f8, f0, f6√13√2122
fadd.d f6, f8, f2√14

保留站

名称BusyopFiFjFKQjQKRjRK
IntegerNo
Add1Yesaddf6f8f2Mult2NoYes
Add2No
Add3No
Mult1No
Mult2Yesdivf8f0f6NoNo

寄存器状态

字段f0f2f4f6f8f10f12∙ ∙ ∙f30
QiAdd1Mult2
ValM【44+x3】*F4M【44+x3】F4M【32+x2】M【44+x3】- F4

19)周期31-【更正为“周期61”】

  • div指令执行完成:22+9=31-【更正为“22+39=61”】

指令状态

指令发射读操作数执行写回
fld f6, 32(× 2)√1√2√3√4
fld f2, 44(× 3)√5√6√7√8
fmul.d f0, f2, f4√6√9√19√20
fsub.d f8, f2, f4√7√9√11√12
fdiv.d f8, f0, f6√13√21√31-【更正为√61】
fadd.d f6, f8, f2√14

保留站

名称BusyopFiFjFKQjQKRjRK
IntegerNo
Add1Yesaddf6f8f2Mult2NoYes
Add2No
Add3No
Mult1No
Mult2Yesdivf8f0f6NoNo

寄存器状态

字段f0f2f4f6f8f10f12∙ ∙ ∙f30
QiAdd1Mult2
ValM【44+x3】*F4M【44+x3】F4M【32+x2】M【44+x3】- F4

20)周期32-【更正为“周期62”】

  • div指令写回;周期结束时,把结果写回到寄存器堆,同时清空记分牌中的信息。
  • 因Mult2阻塞的Add1,在保留站中,删除Qj的Mult2,且Rj设为Yes

指令状态

指令发射读操作数执行写回
fld f6, 32(× 2)√1√2√3√4
fld f2, 44(× 3)√5√6√7√8
fmul.d f0, f2, f4√6√9√19√20
fsub.d f8, f2, f4√7√9√11√12
fdiv.d f8, f0, f6√13√21√31-【更正为√61】√32-【更正为√62】
fadd.d f6, f8, f2√14

保留站

名称BusyopFiFjFKQjQKRjRK
IntegerNo
Add1Yesaddf6f8f2YesYes
Add2No
Add3No
Mult1No
Mult2No

寄存器状态

字段f0f2f4f6f8f10f12∙ ∙ ∙f30
QiAdd1
ValM【44+x3】*F4M【44+x3】F4M【32+x2】M【44+x3】*F4 / M【32+x2】

21)周期33-【更正为“周期63”】

  • add指令读操作数;
  • add指令执行需周期2;

指令状态

指令发射读操作数执行写回
fld f6, 32(× 2)√1√2√3√4
fld f2, 44(× 3)√5√6√7√8
fmul.d f0, f2, f4√6√9√19√20
fsub.d f8, f2, f4√7√9√11√12
fdiv.d f8, f0, f6√13√21√31-【更正为√61】√32-【更正为√62】
2 fadd.d f6, f8, f2√14√33-【更正为√63】

保留站

名称BusyopFiFjFKQjQKRjRK
IntegerNo
Add1Yesaddf6f8f2YesYes
Add2No
Add3No
Mult1No
Mult2No

寄存器状态

字段f0f2f4f6f8f10f12∙ ∙ ∙f30
QiAdd1
ValM【44+x3】*F4M【44+x3】F4M【32+x2】M【44+x3】*F4 / M【32+x2】

22)周期34-【更正为“周期64”】

  • add指令读操作数完成;Rj、Rk设为No
  • add指令执行需周期1;

指令状态

指令发射读操作数执行写回
fld f6, 32(× 2)√1√2√3√4
fld f2, 44(× 3)√5√6√7√8
fmul.d f0, f2, f4√6√9√19√20
fsub.d f8, f2, f4√7√9√11√12
fdiv.d f8, f0, f6√13√21√31-【更正为√61】√32-【更正为√62】
1 fadd.d f6, f8, f2√14√33-【更正为√63】34-【更正为64】

保留站

名称BusyopFiFjFKQjQKRjRK
IntegerNo
Add1Yesaddf6f8f2NoNo
Add2No
Add3No
Mult1No
Mult2No

寄存器状态

字段f0f2f4f6f8f10f12∙ ∙ ∙f30
QiAdd1
ValM【44+x3】*F4M【44+x3】F4M【32+x2】M【44+x3】*F4 / M【32+x2】

23)周期35-【更正为“周期65”】

  • add指令执行完成;

指令状态

指令发射读操作数执行写回
fld f6, 32(× 2)√1√2√3√4
fld f2, 44(× 3)√5√6√7√8
fmul.d f0, f2, f4√6√9√19√20
fsub.d f8, f2, f4√7√9√11√12
fdiv.d f8, f0, f6√13√21√31-【更正为√61】√32-【更正为√62】
fadd.d f6, f8, f2√14√33-【更正为√63】√35-【更正为√65】

保留站

名称BusyopFiFjFKQjQKRjRK
IntegerNo
Add1Yesaddf6f8f2NoNo
Add2No
Add3No
Mult1No
Mult2No

寄存器状态

字段f0f2f4f6f8f10f12∙ ∙ ∙f30
QiAdd1
ValM【44+x3】*F4M【44+x3】F4M【32+x2】M【44+x3】*F4 / M【32+x2】

24)周期36-【更正为“周期66”】

  • add指令写回;周期结束时,把结果写回到寄存器堆,同时清空记分牌中的信息。

指令状态

指令发射读操作数执行写回
fld f6, 32(× 2)√1√2√3√4
fld f2, 44(× 3)√5√6√7√8
fmul.d f0, f2, f4√6√9√19√20
fsub.d f8, f2, f4√7√9√11√12
fdiv.d f8, f0, f6√13√21√31-【更正为√61】√32-【更正为√62】
fadd.d f6, f8, f2√14√33-【更正为√63】√35-【更正为√65】√36-【更正为√66】

保留站

名称BusyopFiFjFKQjQKRjRK
IntegerNo
Add1No
Add2No
Add3No
Mult1No
Mult2No

寄存器状态

字段f0f2f4f6f8f10f12∙ ∙ ∙f30
Qi
ValM【44+x3】*F4M【44+x3】F4M【44+x3】+(M【44+x3】*F4 / M【32+x2】)M【44+x3】*F4 / M【32+x2】

ANSWER

ANSWER:
假设执行周期:加减为2,乘为10,除为40

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
感觉:下图中不应该21就打勾(类似于上面的SET No),而是22周期再打勾(读操作数完成后SET NO);
其他周期的处理,都是执行才打勾,就这里读的时候就打勾了,感觉是笔误。
在这里插入图片描述
在这里插入图片描述
对比:将div的执行周期部分加上(40-10)=30即可,相应的后续写回及add的读、执行、写回都加30;
在这里插入图片描述

(3)Tomasulo 算法运行状态表:

1)周期1

  • 第一条Load指令发射:对应通路的保留站Load1空位
    • 源操作数:Vk–x2;A–32
    • 目的操作数:寄存器状态表中的f6的Qi设为Load1

指令状态

指令发射执行写结果
fld f6, 32(× 2)√1
fld f2, 44(× 3)
fmul.d f0, f2, f4
fsub.d f8, f2, f4
fdiv.d f8, f0, f6
fadd.d f6, f8, f2

保留站

名称BusyopVjVkQjQKA
Load1Yesldx232
Load2No
Add1No
Add2No
Add3No
Mult1No
Mult2No

寄存器状态

字段f0f2f4f6f8f10f12∙ ∙ ∙f30
QiLoad1
Val

2)周期2

  • 第一条Load指令执行:
  • 第二条Load指令发射:对应通路的保留站Load2空位
    • 源操作数:Vk–x3;A–44
    • 目的操作数:寄存器状态表中的f2的Qi设为Load2

指令状态

指令发射执行写结果
fld f6, 32(× 2)√12
fld f2, 44(× 3)√2
fmul.d f0, f2, f4
fsub.d f8, f2, f4
fdiv.d f8, f0, f6
fadd.d f6, f8, f2

保留站

名称BusyopVjVkQjQKA
Load1Yesld32+x2
Load2Yesldx344
Add1No
Add2No
Add3No
Mult1No
Mult2No

寄存器状态

字段f0f2f4f6f8f10f12∙ ∙ ∙f30
QiLoad2Load1
Val

3)周期3

  • 第一条Load指令执行完成
  • 第二条Load指令执行
  • mul指令发射:对应通路的保留站Mult1空位
    • 源操作数:Vk–F4;Qj–Load2
    • 目的操作数:寄存器状态表中的f0的Qi设为Mult1

指令状态

指令发射执行写结果
fld f6, 32(× 2)√1√3
fld f2, 44(× 3)√23
fmul.d f0, f2, f4√3
fsub.d f8, f2, f4
fdiv.d f8, f0, f6
fadd.d f6, f8, f2

保留站

名称BusyopVjVkQjQKA
Load1Yesld32+x2
Load2Yesld44+x3
Add1No
Add2No
Add3No
Mult1YesmulF4Load2
Mult2No

寄存器状态:设f4初始值为F4

字段f0f2f4f6f8f10f12∙ ∙ ∙f30
QiMult1Load2Load1
ValF4

4)周期4

  • 第一条Load指令写回
    • 写回周期结束时,根据寄存器结果状态表来更新寄存器堆中的f6;
    • 清除保留站和寄存器结果状态表的信息
  • 第二条Load指令执行完成
  • sub指令发射:对应通路的保留站Add1空位
    • 源操作数:Vk–F4;Qj–Load2
    • 目的操作数:寄存器状态表中的f8的Qi设为Add1

指令状态

指令发射执行写结果
fld f6, 32(× 2)√1√3√4
fld f2, 44(× 3)√2√4
fmul.d f0, f2, f4√3
fsub.d f8, f2, f4√4
fdiv.d f8, f0, f6
fadd.d f6, f8, f2

保留站

名称BusyopVjVkQjQKA
Load1No
Load2Yesld44+x3
Add1YessubF4Load2
Add2No
Add3No
Mult1YesmulF4Load2
Mult2No

寄存器状态:设f4初始值为F4

字段f0f2f4f6f8f10f12∙ ∙ ∙f30
QiMult1Load2Add1
ValF4M【32+x2】

5)周期5

  • 第二条Load指令写回
    • 写回周期结束时,根据寄存器结果状态表来更新寄存器堆中的f2;
    • 清除保留站和寄存器结果状态表的信息
  • 保留站中的Mult1、Add1:
    • 删去Qj–Load2,改Vj为经CDB传递的f2的值–M【44+x3】
    • Mult1执行需周期10,Add1执行需周期2
  • div指令发射:对应通路的保留站Mult2空位
    • 源操作数:Vk–f6的值M【32+x2】(把能读取的数据直接拷贝到保留站,避免WAR冒险);Qj–Mult1
    • 目的操作数:寄存器状态表中的f8的Qi改为Mult2(寄存器结果状态表中总是存有最新的值,即如果后序指令的目的寄存器和前序指令的目的寄存器重合,只保留后序指令的写信息;解决WAW冒险

指令状态

指令发射执行写结果
fld f6, 32(× 2)√1√3√4
fld f2, 44(× 3)√2√4√5
fmul.d f0, f2, f4√3
fsub.d f8, f2, f4√4
fdiv.d f8, f0, f6√5
fadd.d f6, f8, f2

保留站

名称BusyopVjVkQjQKA
Load1No
Load2No
2 Add1YessubM【44+x3】F4
Add2No
Add3No
10 Mult1YesmulM【44+x3】F4
Mult2YesdivM【32+x2】Mult1

寄存器状态:设f4初始值为F4

字段f0f2f4f6f8f10f12∙ ∙ ∙f30
QiMult1Mult2
ValM【44+x3】F4M【32+x2】

6)周期6

  • 保留站中的Mult1、Add1:
    • Mult1执行还需周期9,Add1执行还需周期1
  • add指令发射:对应通路的保留站Add2空位
    • 源操作数:Vk–f2的值M【44+x3】;Qj–Mult2
    • 目的操作数:寄存器状态表中的f6的Qi改为Add2(寄存器结果状态表中总是存有最新的值,即如果后序指令的目的寄存器和前序指令的目的寄存器重合,只保留后序指令的写信息)

指令状态

指令发射执行写结果
fld f6, 32(× 2)√1√3√4
fld f2, 44(× 3)√2√4√5
fmul.d f0, f2, f4√36
fsub.d f8, f2, f4√46
fdiv.d f8, f0, f6√5
fadd.d f6, f8, f2√6

保留站

名称BusyopVjVkQjQKA
Load1No
Load2No
1 Add1YessubM【44+x3】F4
Add2YesaddM【44+x3】Mult2
Add3No
9 Mult1YesmulM【44+x3】F4
Mult2YesdivM【32+x2】Mult1

寄存器状态:设f4初始值为F4

字段f0f2f4f6f8f10f12∙ ∙ ∙f30
QiMult1Add2Mult2
ValM【44+x3】F4M【32+x2】

7)周期7

  • 保留站中的Mult1、Add1:
    • Mult1执行还需周期8,Add1执行完成

指令状态

指令发射执行写结果
fld f6, 32(× 2)√1√3√4
fld f2, 44(× 3)√2√4√5
fmul.d f0, f2, f4√37
fsub.d f8, f2, f4√4√7
fdiv.d f8, f0, f6√5
fadd.d f6, f8, f2√6

保留站

名称BusyopVjVkQjQKA
Load1No
Load2No
Add1YessubM【44+x3】F4
Add2YesaddM【44+x3】Mult2
Add3No
8 Mult1YesmulM【44+x3】F4
Mult2YesdivM【32+x2】Mult1

寄存器状态:设f4初始值为F4

字段f0f2f4f6f8f10f12∙ ∙ ∙f30
QiMult1Add2Mult2
ValM【44+x3】F4M【32+x2】

8)周期8

  • 保留站中的Mult1:
    • Mult1执行还需周期7
  • Add1–sub指令写回
    • 写回周期结束时,经CDB传递数据到寄存器堆和保留站,但是这里不会更新寄存器堆中的f8;因为f8只接受Qi–Mult2的写回数据(解决WAW冒险
    • 清除保留站和寄存器结果状态表的信息

指令状态

指令发射执行写结果
fld f6, 32(× 2)√1√3√4
fld f2, 44(× 3)√2√4√5
fmul.d f0, f2, f4√38
fsub.d f8, f2, f4√4√7√8
fdiv.d f8, f0, f6√5
fadd.d f6, f8, f2√6

保留站

名称BusyopVjVkQjQKA
Load1No
Load2No
Add1No
Add2YesaddM【44+x3】Mult2
Add3No
7 Mult1YesmulM【44+x3】F4
Mult2YesdivM【32+x2】Mult1

寄存器状态:设f4初始值为F4

字段f0f2f4f6f8f10f12∙ ∙ ∙f30
QiMult1Add2Mult2
ValM【44+x3】F4M【32+x2】

9)周期15

  • 保留站中的Mult1执行完成:

指令状态

指令发射执行写结果
fld f6, 32(× 2)√1√3√4
fld f2, 44(× 3)√2√4√5
fmul.d f0, f2, f4√3√15
fsub.d f8, f2, f4√4√7√8
fdiv.d f8, f0, f6√5
fadd.d f6, f8, f2√6

保留站

名称BusyopVjVkQjQKA
Load1No
Load2No
Add1No
Add2YesaddM【44+x3】Mult2
Add3No
Mult1YesmulM【44+x3】F4
Mult2YesdivM【32+x2】Mult1

寄存器状态:设f4初始值为F4

字段f0f2f4f6f8f10f12∙ ∙ ∙f30
QiMult1Add2Mult2
ValM【44+x3】F4M【32+x2】

10)周期16-【更正】

  • Mult1-mul指令写回
    • 写回周期结束时,经CDB传递数据到寄存器堆和保留站,会更新寄存器堆中的f0;
    • 清除保留站和寄存器结果状态表的信息
  • 保留站中的Mult2:
    • 删去Qj–Mult1,改Vj为经CDB传递的f0的值–M【44+x3】*F4
    • Mult2执行需周期10-【更正为40】

指令状态

指令发射执行写结果
fld f6, 32(× 2)√1√3√4
fld f2, 44(× 3)√2√4√5
fmul.d f0, f2, f4√3√15√16
fsub.d f8, f2, f4√4√7√8
fdiv.d f8, f0, f6√5
fadd.d f6, f8, f2√6

保留站

名称BusyopVjVkQjQKA
Load1No
Load2No
Add1No
Add2YesaddM【44+x3】Mult2
Add3No
Mult1No
10-【更正为40】 Mult2YesdivM【44+x3】*F4M【32+x2】

寄存器状态:设f4初始值为F4

字段f0f2f4f6f8f10f12∙ ∙ ∙f30
QiAdd2Mult2
ValM【44+x3】*F4M【44+x3】F4M【32+x2】

11)周期26-【更正为“周期56”】

  • Mult2-div指令执行完成

指令状态

指令发射执行写结果
fld f6, 32(× 2)√1√3√4
fld f2, 44(× 3)√2√4√5
fmul.d f0, f2, f4√3√15√16
fsub.d f8, f2, f4√4√7√8
fdiv.d f8, f0, f6√5√26-【更正为√56】
fadd.d f6, f8, f2√6

保留站

名称BusyopVjVkQjQKA
Load1No
Load2No
Add1No
Add2YesaddM【44+x3】Mult2
Add3No
Mult1No
Mult2YesdivM【44+x3】*F4M【32+x2】

寄存器状态:设f4初始值为F4

字段f0f2f4f6f8f10f12∙ ∙ ∙f30
QiAdd2Mult2
ValM【44+x3】*F4M【44+x3】F4M【32+x2】

12)周期27-【更正为“周期57”】

  • Mult2-div指令写回
    • 写回周期结束时,经CDB传递数据到寄存器堆和保留站,会更新寄存器堆中的f8;
    • 清除保留站和寄存器结果状态表的信息
  • 保留站中的Add2:
    • 删去Qj–Mult2,改Vj为经CDB传递的f8的值–M【44+x3】*F4 / M【32+x2】
    • Add2执行需周期2

指令状态

指令发射执行写结果
fld f6, 32(× 2)√1√3√4
fld f2, 44(× 3)√2√4√5
fmul.d f0, f2, f4√3√15√16
fsub.d f8, f2, f4√4√7√8
fdiv.d f8, f0, f6√5√26-【更正为√56】√27-【更正为√57】
fadd.d f6, f8, f2√6

保留站

名称BusyopVjVkQjQKA
Load1No
Load2No
Add1No
2 Add2YesaddM【44+x3】*F4 / M【32+x2】M【44+x3】
Add3No
Mult1No
Mult2No

寄存器状态:设f4初始值为F4

字段f0f2f4f6f8f10f12∙ ∙ ∙f30
QiAdd2
ValM【44+x3】*F4M【44+x3】F4M【32+x2】M【44+x3】*F4 / M【32+x2】

13)周期29-【更正为“周期59”】

  • Add2执行完成

指令状态

指令发射执行写结果
fld f6, 32(× 2)√1√3√4
fld f2, 44(× 3)√2√4√5
fmul.d f0, f2, f4√3√15√16
fsub.d f8, f2, f4√4√7√8
fdiv.d f8, f0, f6√5√26-【更正为√56】√27-【更正为√57】
fadd.d f6, f8, f2√6√29-【更正为√59】

保留站

名称BusyopVjVkQjQKA
Load1No
Load2No
Add1No
Add2YesaddM【44+x3】*F4 / M【32+x2】M【44+x3】
Add3No
Mult1No
Mult2No

寄存器状态:设f4初始值为F4

字段f0f2f4f6f8f10f12∙ ∙ ∙f30
QiAdd2
ValM【44+x3】*F4M【44+x3】F4M【32+x2】M【44+x3】*F4 / M【32+x2】

14)周期30-【更正为“周期60”】

  • Add2指令写回:
    • 写回周期结束时,经CDB传递数据到寄存器堆和保留站,会更新寄存器堆中的f6;
    • 清除保留站和寄存器结果状态表的信息

①指令状态

指令发射执行写结果
fld f6, 32(× 2)√1√3√4
fld f2, 44(× 3)√2√4√5
fmul.d f0, f2, f4√3√15√16
fsub.d f8, f2, f4√4√7√8
fdiv.d f8, f0, f6√5√26-【更正为√56】√27-【更正为√57】
fadd.d f6, f8, f2√6√29-【更正为√59】√30-【更正为√60】

对比记分牌指令状态

指令发射读操作数执行写回
fld f6, 32(× 2)√1√2√3√4
fld f2, 44(× 3)√5√6√7√8
fmul.d f0, f2, f4√6√9√19√20
fsub.d f8, f2, f4√7√9√11√12
fdiv.d f8, f0, f6√13√21√31-【更正为√61】√32-【更正为√62】
fadd.d f6, f8, f2√14√33-【更正为√63】√35-【更正为√65】√36-【更正为√66】

②保留站

名称BusyopVjVkQjQKA
Load1No
Load2No
Add1No
Add2No
Add3No
Mult1No
Mult2No

对比记分牌保留站

名称BusyopFiFjFKQjQKRjRK
IntegerNo
Add1No
Add2No
Add3No
Mult1No
Mult2No

③寄存器状态:设f4初始值为F4

字段f0f2f4f6f8f10f12∙ ∙ ∙f30
Qi
ValM【44+x3】*F4M【44+x3】F4M【44+x3】+ (M【44+x3】*F4 / M【32+x2】)M【44+x3】*F4 / M【32+x2】

对比记分牌寄存器状态

字段f0f2f4f6f8f10f12∙ ∙ ∙f30
Qi
ValM【44+x3】*F4M【44+x3】F4M【44+x3】+(M【44+x3】*F4 / M【32+x2】)M【44+x3】*F4 / M【32+x2】

ANSWER

ANSWER:

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
对比:将div的执行周期部分加上(40-10)=30即可,相应的后续写回及add的执行、写回都加30;

在这里插入图片描述

另外的方法:Tomasulo模拟器

根据实验二的Tomasulo模拟器,可以测试一下。
在这里插入图片描述

(4)两种算法的异同

  • Tomasulo算法
    • WAR相关:在发射时就拷贝数据,贯彻数据流思想——“寄存器名字不重要,寄存器里的数据才重要”;
    • WAW相关:只保存最新的写入值,既保证了正确的结果,又减少了不必要的写回操作;
    • RAW相关:(与Score Board算法的同)用CDB总线实现了逻辑上的正确,都解决了写后读冒险;
    • 结构相关:引入保留站,每条通路可以缓冲多条指令,平缓了指令发射的速度;
    • 分布式 :指令状态、相关控制和操作数缓存分布在各个部件中(保留站);
  • Score Board算法
    • WAR相关:过度纠结寄存器名字,指令在执行之前一直检测的是寄存器堆,一旦数据准备好,就会从寄存器堆中取数;使得后序指令即使计算完结果也可能不能立刻写回寄存器堆;【tag广播】
    • WAW相关:过度纠结寄存器名字,会把所有指令的结果都写进寄存器堆,会因为写后写冒险阻塞指令发射;【停滞写回机制】
    • RAW相关:执行前需要所有操作数都准备好,解决了写后读冒险;【停滞发射】
    • 结构相关:每条通路只能存一条指令,导致经常有指令因为结构冒险而不能发射;
    • 集中式:指令状态和相关控制都在记分牌处理;

ANSWER:
在这里插入图片描述

七、ISA 设计

解释下图每条指令的功能,怎么理解 ISA 设计的正交性原则。

在这里插入图片描述
图A.25 RISC-V中的加载和存储指令。

  • 小于64位的加载有符号扩展和零扩展形式。
  • 所有的内存引用都使用一个单一的寻址模式。当然,所显示的所有数据类型都可以使用加载和存储。
  • 因为RV64G支持双精度浮点加载,所以所有单精度浮点加载都必须在FP寄存器中对齐,即64位宽。

(1)每条指令的功能

序号指令功能
1ld x1, 80(x2)加载双字(64位);从内存地址为 80+Regs[x2] 处读8个字节,存到寄存器 x1
2lw x1, 60(x2)加载字(32位);从内存地址为 60+Regs[x2] 处读4个字节,经符号位扩展后,存到寄存器 x1
3lwu x1, 60(x2)无符号加载字(32位);从内存地址为 60+Regs[x2] 处读4个字节,经零扩展后,存到寄存器 x1
4lb x1, 40(x3)加载字节(8位);从内存地址为 40+Regs[x3] 处读1个字节,经符号位扩展后,存到寄存器 x1
5lbu x1, 40(x3)无符号加载字节(8位);从内存地址为 40+Regs[x3] 处读1个字节,经零扩展后,存到寄存器 x1
6lh x1, 40(x3)加载半字(16位);从内存地址为 40+Regs[x3] 处读取2个字节,经符号位扩展后,存到寄存器 x1
7flw f0, 50(x3)加载单精度浮点数;从内存地址为 50+Regs[x3] 处读4个字节,存到浮点寄存器 f0 中(在f0中对齐)
8fld f0, 50(x2)加载双精度浮点数;从内存地址为 50+Regs[x2] 处读8个字节,存到浮点寄存器 f0 中
9sd x2, 400(x3)存储双字(64位);将寄存器 x2 中的数据,存储到内存地址为 400+Regs[x3] 处
10sw x3, 500(x4)存储字(32位);将寄存器 x3 中的数据的低 32 位,存储到内存地址为 500+Regs[x4] 处。
11fsw f0, 40(x3)存储单精度浮点数;将浮点寄存器 f0 中的数据,转换成4字节的单精度浮点数形式,存储到内存地址为 40+Regs[x3] 处
12fsd f0, 40(x3)存储双精度浮点数;将浮点寄存器 f0 中的数据,存储到内存地址为 40+Regs[x3] 处
13sh x3, 502(x2)存储半字(16位);将寄存器 x3 中的数据的低 16 位,存储到内存地址为 502+Regs[x2] 处
14sb x2, 41(x3):存储字节(8位);将寄存器 x2 中的数据的低 8 位,存储到内存地址为 41+Regs[x3] 处

ASNWER:
在这里插入图片描述
在这里插入图片描述

(2)ISA 设计的正交性原则

  1. 正交性原则的定义: 指令集中的各个部分之间彼此独立,不存在功能上的重叠或冲突。
  2. 在这些加载和存储指令中,正交性原则体现在:
    • 指令功能没有冲突:每个指令都有自己独特的功能,不会与其他指令的功能发生冲突。例如加载双字、加载字、加载半字、加载字节等
    • 指令功能没有重叠:每个指令都提供了唯一的功能,没有冗余或重叠的部分。例如,lw和lb指令都是加载数据到寄存器,但一个是加载字,一个是加载字节,它们的功能互相独立,没有重复。
    • 指令操作对象独立:不同的加载和存储指令操作不同的数据类型(如双字、字、半字、字节、单精度浮点数、双精度浮点数),并且每个指令的操作对象(寄存器或内存)都是独立的,彼此之间没有交叉或冲突。
    • 一致的指令格式:尽管指令的功能各不相同,但它们都遵循了统一的指令格式和寻址模式。这种一致性使得指令的编码和解码更加简单和高效。
  • Load、Store为I、S型指令
    在这里插入图片描述
  • 相应的指令编码
    • 32位 在这里插入图片描述

    • 64位
      在这里插入图片描述

ANSWER:

在这里插入图片描述

  • 67
    点赞
  • 52
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值