一、题目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
- S1定义了一个值,随后S2使用了这个值。
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
- S1使用了一个值,而随后S2定义了这个值。
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 位内存地址。 假设每个
缓存块的初始标签值如下:
块 | 标签 |
---|---|
00 | 00110 |
01 | 00001 |
10 | 00000 |
11 | Invalid |
处理器从以下十进制地址顺序读取数据: 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
- 有Cache的平均CPI:
-
解答的依据:
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)以下地址位分配的每个字段的宽度是多少
TAG | Set index | Block offset |
---|---|---|
32-14-5=13 | 19-5=14 | 5 |
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位数+数据位数)=214∗(1+1+13+32∗8)=214∗(15+256)
说明:
-
一般的,每行都需要有Valid、Tag、Block:
- 行匹配时,会检查valid和Tag
- 行匹配时,会检查valid和Tag
-
写回,需要增加一个脏位,用于判断写回时是否更新主存内容
-
5.2 单级、 1KB 直接映射L1缓存
b)假设有一个单级、 1KB 直接映射L1缓存和 16 字节块。有 4GB的内存。
一个整数是 4 字节。数组是块对齐的.
1)计算L1缓存中的标签(tag)、索引(index)和偏移位(offset bits)的个数
TAG | Set index | Block offset |
---|---|---|
32-10=22 | 10-4= 6 | 4 |
六、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 |
保留站
名称 | Busy | op | Fi | Fj | FK | Qj | QK | Rj | RK |
---|---|---|---|---|---|---|---|---|---|
Integer | Yes | Load | f6 | x2 | Yes | ||||
Add1 | No | ||||||||
Add2 | No | ||||||||
Add3 | No | ||||||||
Mult1 | No | ||||||||
Mult2 | No |
寄存器状态
字段 | f0 | f2 | f4 | f6 | f8 | f10 | f12 | ∙ ∙ ∙ | f30 |
---|---|---|---|---|---|---|---|---|---|
Qi | Integer | ||||||||
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 |
保留站
名称 | Busy | op | Fi | Fj | FK | Qj | QK | Rj | RK |
---|---|---|---|---|---|---|---|---|---|
Integer | Yes | Load | f6 | x2 | Yes | ||||
Add1 | No | ||||||||
Add2 | No | ||||||||
Add3 | No | ||||||||
Mult1 | No | ||||||||
Mult2 | No |
寄存器状态
字段 | f0 | f2 | f4 | f6 | f8 | f10 | f12 | ∙ ∙ ∙ | f30 |
---|---|---|---|---|---|---|---|---|---|
Qi | Integer | ||||||||
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 |
保留站
名称 | Busy | op | Fi | Fj | FK | Qj | QK | Rj | RK |
---|---|---|---|---|---|---|---|---|---|
Integer | Yes | Load | f6 | x2 | No | ||||
Add1 | No | ||||||||
Add2 | No | ||||||||
Add3 | No | ||||||||
Mult1 | No | ||||||||
Mult2 | No |
寄存器状态
字段 | f0 | f2 | f4 | f6 | f8 | f10 | f12 | ∙ ∙ ∙ | f30 |
---|---|---|---|---|---|---|---|---|---|
Qi | Integer | ||||||||
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 |
保留站
名称 | Busy | op | Fi | Fj | FK | Qj | QK | Rj | RK |
---|---|---|---|---|---|---|---|---|---|
Integer | No | ||||||||
Add1 | No | ||||||||
Add2 | No | ||||||||
Add3 | No | ||||||||
Mult1 | No | ||||||||
Mult2 | No |
寄存器状态
字段 | f0 | f2 | f4 | f6 | f8 | f10 | f12 | ∙ ∙ ∙ | f30 |
---|---|---|---|---|---|---|---|---|---|
Qi | |||||||||
Val | M【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 |
保留站
名称 | Busy | op | Fi | Fj | FK | Qj | QK | Rj | RK |
---|---|---|---|---|---|---|---|---|---|
Integer | Yes | Load | f2 | x3 | Yes | ||||
Add1 | No | ||||||||
Add2 | No | ||||||||
Add3 | No | ||||||||
Mult1 | No | ||||||||
Mult2 | No |
寄存器状态
字段 | f0 | f2 | f4 | f6 | f8 | f10 | f12 | ∙ ∙ ∙ | f30 |
---|---|---|---|---|---|---|---|---|---|
Qi | Integer | ||||||||
Val | M【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 |
保留站
名称 | Busy | op | Fi | Fj | FK | Qj | QK | Rj | RK |
---|---|---|---|---|---|---|---|---|---|
Integer | Yes | Load | f2 | x3 | Yes | ||||
Add1 | No | ||||||||
Add2 | No | ||||||||
Add3 | No | ||||||||
Mult1 | Yes | mul | f0 | f2 | f4 | Integer | No | Yes | |
Mult2 | No |
寄存器状态
字段 | f0 | f2 | f4 | f6 | f8 | f10 | f12 | ∙ ∙ ∙ | f30 |
---|---|---|---|---|---|---|---|---|---|
Qi | Mult1 | Integer | |||||||
Val | M【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 |
保留站
名称 | Busy | op | Fi | Fj | FK | Qj | QK | Rj | RK |
---|---|---|---|---|---|---|---|---|---|
Integer | Yes | Load | f2 | x3 | No | ||||
Add1 | Yes | sub | f8 | f2 | f4 | Integer | No | Yes | |
Add2 | No | ||||||||
Add3 | No | ||||||||
Mult1 | Yes | mul | f0 | f2 | f4 | Integer | No | Yes | |
Mult2 | No |
寄存器状态
字段 | f0 | f2 | f4 | f6 | f8 | f10 | f12 | ∙ ∙ ∙ | f30 |
---|---|---|---|---|---|---|---|---|---|
Qi | Mult1 | Integer | Add1 | ||||||
Val | M【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 |
保留站
名称 | Busy | op | Fi | Fj | FK | Qj | QK | Rj | RK |
---|---|---|---|---|---|---|---|---|---|
Integer | No | ||||||||
Add1 | Yes | sub | f8 | f2 | f4 | Yes | Yes | ||
Add2 | No | ||||||||
Add3 | No | ||||||||
Mult1 | Yes | mul | f0 | f2 | f4 | Yes | Yes | ||
Mult2 | No |
寄存器状态
字段 | f0 | f2 | f4 | f6 | f8 | f10 | f12 | ∙ ∙ ∙ | f30 |
---|---|---|---|---|---|---|---|---|---|
Qi | Mult1 | Add1 | |||||||
Val | M【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 |
保留站
名称 | Busy | op | Fi | Fj | FK | Qj | QK | Rj | RK |
---|---|---|---|---|---|---|---|---|---|
Integer | No | ||||||||
2 Add1 | Yes | sub | f8 | f2 | f4 | Yes | Yes | ||
Add2 | No | ||||||||
Add3 | No | ||||||||
10 Mult1 | Yes | mul | f0 | f2 | f4 | Yes | Yes | ||
Mult2 | No |
寄存器状态
字段 | f0 | f2 | f4 | f6 | f8 | f10 | f12 | ∙ ∙ ∙ | f30 |
---|---|---|---|---|---|---|---|---|---|
Qi | Mult1 | Add1 | |||||||
Val | M【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 | √9 | 10 | |
fsub.d f8, f2, f4 | √7 | √9 | 10 | |
fdiv.d f8, f0, f6 | ||||
fadd.d f6, f8, f2 |
保留站
名称 | Busy | op | Fi | Fj | FK | Qj | QK | Rj | RK |
---|---|---|---|---|---|---|---|---|---|
Integer | No | ||||||||
1 Add1 | Yes | sub | f8 | f2 | f4 | No | No | ||
Add2 | No | ||||||||
Add3 | No | ||||||||
9 Mult1 | Yes | mul | f0 | f2 | f4 | No | No | ||
Mult2 | No |
寄存器状态
字段 | f0 | f2 | f4 | f6 | f8 | f10 | f12 | ∙ ∙ ∙ | f30 |
---|---|---|---|---|---|---|---|---|---|
Qi | Mult1 | Add1 | |||||||
Val | M【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 | √9 | 11 | |
fsub.d f8, f2, f4 | √7 | √9 | √11 | |
fdiv.d f8, f0, f6 | ||||
fadd.d f6, f8, f2 |
保留站
名称 | Busy | op | Fi | Fj | FK | Qj | QK | Rj | RK |
---|---|---|---|---|---|---|---|---|---|
Integer | No | ||||||||
Add1 | Yes | sub | f8 | f2 | f4 | No | No | ||
Add2 | No | ||||||||
Add3 | No | ||||||||
8 Mult1 | Yes | mul | f0 | f2 | f4 | No | No | ||
Mult2 | No |
寄存器状态
字段 | f0 | f2 | f4 | f6 | f8 | f10 | f12 | ∙ ∙ ∙ | f30 |
---|---|---|---|---|---|---|---|---|---|
Qi | Mult1 | Add1 | |||||||
Val | M【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 | √9 | 12 | |
fsub.d f8, f2, f4 | √7 | √9 | √11 | √12 |
fdiv.d f8, f0, f6 | ||||
fadd.d f6, f8, f2 |
保留站
名称 | Busy | op | Fi | Fj | FK | Qj | QK | Rj | RK |
---|---|---|---|---|---|---|---|---|---|
Integer | No | ||||||||
Add1 | No | ||||||||
Add2 | No | ||||||||
Add3 | No | ||||||||
7 Mult1 | Yes | mul | f0 | f2 | f4 | No | No | ||
Mult2 | No |
寄存器状态
假设f4中的值初始为F4
字段 | f0 | f2 | f4 | f6 | f8 | f10 | f12 | ∙ ∙ ∙ | f30 |
---|---|---|---|---|---|---|---|---|---|
Qi | Mult1 | ||||||||
Val | M【44+x3】 | F4 | M【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 | √9 | 13 | |
fsub.d f8, f2, f4 | √7 | √9 | √11 | √12 |
fdiv.d f8, f0, f6 | √13 | |||
fadd.d f6, f8, f2 |
保留站
名称 | Busy | op | Fi | Fj | FK | Qj | QK | Rj | RK |
---|---|---|---|---|---|---|---|---|---|
Integer | No | ||||||||
Add1 | No | ||||||||
Add2 | No | ||||||||
Add3 | No | ||||||||
6 Mult1 | Yes | mul | f0 | f2 | f4 | No | No | ||
Mult2 | Yes | div | f8 | f0 | f6 | Mult1 | No | Yes |
寄存器状态
字段 | f0 | f2 | f4 | f6 | f8 | f10 | f12 | ∙ ∙ ∙ | f30 |
---|---|---|---|---|---|---|---|---|---|
Qi | Mult1 | Mult2 | |||||||
Val | M【44+x3】 | F4 | M【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 | √9 | 14 | |
fsub.d f8, f2, f4 | √7 | √9 | √11 | √12 |
fdiv.d f8, f0, f6 | √13 | |||
fadd.d f6, f8, f2 | √14 |
保留站
名称 | Busy | op | Fi | Fj | FK | Qj | QK | Rj | RK |
---|---|---|---|---|---|---|---|---|---|
Integer | No | ||||||||
Add1 | Yes | add | f6 | f8 | f2 | Mult2 | No | Yes | |
Add2 | No | ||||||||
Add3 | No | ||||||||
5 Mult1 | Yes | mul | f0 | f2 | f4 | No | No | ||
Mult2 | Yes | div | f8 | f0 | f6 | Mult1 | No | Yes |
寄存器状态
字段 | f0 | f2 | f4 | f6 | f8 | f10 | f12 | ∙ ∙ ∙ | f30 |
---|---|---|---|---|---|---|---|---|---|
Qi | Mult1 | Add1 | Mult2 | ||||||
Val | M【44+x3】 | F4 | M【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 |
保留站
名称 | Busy | op | Fi | Fj | FK | Qj | QK | Rj | RK |
---|---|---|---|---|---|---|---|---|---|
Integer | No | ||||||||
Add1 | Yes | add | f6 | f8 | f2 | Mult2 | No | Yes | |
Add2 | No | ||||||||
Add3 | No | ||||||||
Mult1 | Yes | mul | f0 | f2 | f4 | No | No | ||
Mult2 | Yes | div | f8 | f0 | f6 | Mult1 | No | Yes |
寄存器状态
字段 | f0 | f2 | f4 | f6 | f8 | f10 | f12 | ∙ ∙ ∙ | f30 |
---|---|---|---|---|---|---|---|---|---|
Qi | Mult1 | Add1 | Mult2 | ||||||
Val | M【44+x3】 | F4 | M【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 |
保留站
名称 | Busy | op | Fi | Fj | FK | Qj | QK | Rj | RK |
---|---|---|---|---|---|---|---|---|---|
Integer | No | ||||||||
Add1 | Yes | add | f6 | f8 | f2 | Mult2 | No | Yes | |
Add2 | No | ||||||||
Add3 | No | ||||||||
Mult1 | No | ||||||||
Mult2 | Yes | div | f8 | f0 | f6 | Yes | Yes |
寄存器状态
字段 | f0 | f2 | f4 | f6 | f8 | f10 | f12 | ∙ ∙ ∙ | f30 |
---|---|---|---|---|---|---|---|---|---|
Qi | Add1 | Mult2 | |||||||
Val | M【44+x3】*F4 | M【44+x3】 | F4 | M【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 |
保留站
名称 | Busy | op | Fi | Fj | FK | Qj | QK | Rj | RK |
---|---|---|---|---|---|---|---|---|---|
Integer | No | ||||||||
Add1 | Yes | add | f6 | f8 | f2 | Mult2 | No | Yes | |
Add2 | No | ||||||||
Add3 | No | ||||||||
Mult1 | No | ||||||||
Mult2 | Yes | div | f8 | f0 | f6 | Yes | Yes |
寄存器状态
字段 | f0 | f2 | f4 | f6 | f8 | f10 | f12 | ∙ ∙ ∙ | f30 |
---|---|---|---|---|---|---|---|---|---|
Qi | Add1 | Mult2 | |||||||
Val | M【44+x3】*F4 | M【44+x3】 | F4 | M【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 | √21 | 22 | |
fadd.d f6, f8, f2 | √14 |
保留站
名称 | Busy | op | Fi | Fj | FK | Qj | QK | Rj | RK |
---|---|---|---|---|---|---|---|---|---|
Integer | No | ||||||||
Add1 | Yes | add | f6 | f8 | f2 | Mult2 | No | Yes | |
Add2 | No | ||||||||
Add3 | No | ||||||||
Mult1 | No | ||||||||
Mult2 | Yes | div | f8 | f0 | f6 | No | No |
寄存器状态
字段 | f0 | f2 | f4 | f6 | f8 | f10 | f12 | ∙ ∙ ∙ | f30 |
---|---|---|---|---|---|---|---|---|---|
Qi | Add1 | Mult2 | |||||||
Val | M【44+x3】*F4 | M【44+x3】 | F4 | M【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 |
保留站
名称 | Busy | op | Fi | Fj | FK | Qj | QK | Rj | RK |
---|---|---|---|---|---|---|---|---|---|
Integer | No | ||||||||
Add1 | Yes | add | f6 | f8 | f2 | Mult2 | No | Yes | |
Add2 | No | ||||||||
Add3 | No | ||||||||
Mult1 | No | ||||||||
Mult2 | Yes | div | f8 | f0 | f6 | No | No |
寄存器状态
字段 | f0 | f2 | f4 | f6 | f8 | f10 | f12 | ∙ ∙ ∙ | f30 |
---|---|---|---|---|---|---|---|---|---|
Qi | Add1 | Mult2 | |||||||
Val | M【44+x3】*F4 | M【44+x3】 | F4 | M【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 |
保留站
名称 | Busy | op | Fi | Fj | FK | Qj | QK | Rj | RK |
---|---|---|---|---|---|---|---|---|---|
Integer | No | ||||||||
Add1 | Yes | add | f6 | f8 | f2 | Yes | Yes | ||
Add2 | No | ||||||||
Add3 | No | ||||||||
Mult1 | No | ||||||||
Mult2 | No |
寄存器状态
字段 | f0 | f2 | f4 | f6 | f8 | f10 | f12 | ∙ ∙ ∙ | f30 |
---|---|---|---|---|---|---|---|---|---|
Qi | Add1 | ||||||||
Val | M【44+x3】*F4 | M【44+x3】 | F4 | M【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】 |
保留站
名称 | Busy | op | Fi | Fj | FK | Qj | QK | Rj | RK |
---|---|---|---|---|---|---|---|---|---|
Integer | No | ||||||||
Add1 | Yes | add | f6 | f8 | f2 | Yes | Yes | ||
Add2 | No | ||||||||
Add3 | No | ||||||||
Mult1 | No | ||||||||
Mult2 | No |
寄存器状态
字段 | f0 | f2 | f4 | f6 | f8 | f10 | f12 | ∙ ∙ ∙ | f30 |
---|---|---|---|---|---|---|---|---|---|
Qi | Add1 | ||||||||
Val | M【44+x3】*F4 | M【44+x3】 | F4 | M【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】 |
保留站
名称 | Busy | op | Fi | Fj | FK | Qj | QK | Rj | RK |
---|---|---|---|---|---|---|---|---|---|
Integer | No | ||||||||
Add1 | Yes | add | f6 | f8 | f2 | No | No | ||
Add2 | No | ||||||||
Add3 | No | ||||||||
Mult1 | No | ||||||||
Mult2 | No |
寄存器状态
字段 | f0 | f2 | f4 | f6 | f8 | f10 | f12 | ∙ ∙ ∙ | f30 |
---|---|---|---|---|---|---|---|---|---|
Qi | Add1 | ||||||||
Val | M【44+x3】*F4 | M【44+x3】 | F4 | M【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】 |
保留站
名称 | Busy | op | Fi | Fj | FK | Qj | QK | Rj | RK |
---|---|---|---|---|---|---|---|---|---|
Integer | No | ||||||||
Add1 | Yes | add | f6 | f8 | f2 | No | No | ||
Add2 | No | ||||||||
Add3 | No | ||||||||
Mult1 | No | ||||||||
Mult2 | No |
寄存器状态
字段 | f0 | f2 | f4 | f6 | f8 | f10 | f12 | ∙ ∙ ∙ | f30 |
---|---|---|---|---|---|---|---|---|---|
Qi | Add1 | ||||||||
Val | M【44+x3】*F4 | M【44+x3】 | F4 | M【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】 |
保留站
名称 | Busy | op | Fi | Fj | FK | Qj | QK | Rj | RK |
---|---|---|---|---|---|---|---|---|---|
Integer | No | ||||||||
Add1 | No | ||||||||
Add2 | No | ||||||||
Add3 | No | ||||||||
Mult1 | No | ||||||||
Mult2 | No |
寄存器状态
字段 | f0 | f2 | f4 | f6 | f8 | f10 | f12 | ∙ ∙ ∙ | f30 |
---|---|---|---|---|---|---|---|---|---|
Qi | |||||||||
Val | M【44+x3】*F4 | M【44+x3】 | F4 | M【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 |
保留站
名称 | Busy | op | Vj | Vk | Qj | QK | A |
---|---|---|---|---|---|---|---|
Load1 | Yes | ld | x2 | 32 | |||
Load2 | No | ||||||
Add1 | No | ||||||
Add2 | No | ||||||
Add3 | No | ||||||
Mult1 | No | ||||||
Mult2 | No |
寄存器状态
字段 | f0 | f2 | f4 | f6 | f8 | f10 | f12 | ∙ ∙ ∙ | f30 |
---|---|---|---|---|---|---|---|---|---|
Qi | Load1 | ||||||||
Val |
2)周期2
- 第一条Load指令执行:
- 第二条Load指令发射:对应通路的保留站Load2空位
- 源操作数:Vk–x3;A–44
- 目的操作数:寄存器状态表中的f2的Qi设为Load2
指令状态
指令 | 发射 | 执行 | 写结果 |
---|---|---|---|
fld f6, 32(× 2) | √1 | 2 | |
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 |
保留站
名称 | Busy | op | Vj | Vk | Qj | QK | A |
---|---|---|---|---|---|---|---|
Load1 | Yes | ld | 32+x2 | ||||
Load2 | Yes | ld | x3 | 44 | |||
Add1 | No | ||||||
Add2 | No | ||||||
Add3 | No | ||||||
Mult1 | No | ||||||
Mult2 | No |
寄存器状态
字段 | f0 | f2 | f4 | f6 | f8 | f10 | f12 | ∙ ∙ ∙ | f30 |
---|---|---|---|---|---|---|---|---|---|
Qi | Load2 | Load1 | |||||||
Val |
3)周期3
- 第一条Load指令执行完成
- 第二条Load指令执行
- mul指令发射:对应通路的保留站Mult1空位
- 源操作数:Vk–F4;Qj–Load2
- 目的操作数:寄存器状态表中的f0的Qi设为Mult1
指令状态
指令 | 发射 | 执行 | 写结果 |
---|---|---|---|
fld f6, 32(× 2) | √1 | √3 | |
fld f2, 44(× 3) | √2 | 3 | |
fmul.d f0, f2, f4 | √3 | ||
fsub.d f8, f2, f4 | |||
fdiv.d f8, f0, f6 | |||
fadd.d f6, f8, f2 |
保留站
名称 | Busy | op | Vj | Vk | Qj | QK | A |
---|---|---|---|---|---|---|---|
Load1 | Yes | ld | 32+x2 | ||||
Load2 | Yes | ld | 44+x3 | ||||
Add1 | No | ||||||
Add2 | No | ||||||
Add3 | No | ||||||
Mult1 | Yes | mul | F4 | Load2 | |||
Mult2 | No |
寄存器状态:设f4初始值为F4
字段 | f0 | f2 | f4 | f6 | f8 | f10 | f12 | ∙ ∙ ∙ | f30 |
---|---|---|---|---|---|---|---|---|---|
Qi | Mult1 | Load2 | Load1 | ||||||
Val | F4 |
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 |
保留站
名称 | Busy | op | Vj | Vk | Qj | QK | A |
---|---|---|---|---|---|---|---|
Load1 | No | ||||||
Load2 | Yes | ld | 44+x3 | ||||
Add1 | Yes | sub | F4 | Load2 | |||
Add2 | No | ||||||
Add3 | No | ||||||
Mult1 | Yes | mul | F4 | Load2 | |||
Mult2 | No |
寄存器状态:设f4初始值为F4
字段 | f0 | f2 | f4 | f6 | f8 | f10 | f12 | ∙ ∙ ∙ | f30 |
---|---|---|---|---|---|---|---|---|---|
Qi | Mult1 | Load2 | Add1 | ||||||
Val | F4 | M【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 |
保留站
名称 | Busy | op | Vj | Vk | Qj | QK | A |
---|---|---|---|---|---|---|---|
Load1 | No | ||||||
Load2 | No | ||||||
2 Add1 | Yes | sub | M【44+x3】 | F4 | |||
Add2 | No | ||||||
Add3 | No | ||||||
10 Mult1 | Yes | mul | M【44+x3】 | F4 | |||
Mult2 | Yes | div | M【32+x2】 | Mult1 |
寄存器状态:设f4初始值为F4
字段 | f0 | f2 | f4 | f6 | f8 | f10 | f12 | ∙ ∙ ∙ | f30 |
---|---|---|---|---|---|---|---|---|---|
Qi | Mult1 | Mult2 | |||||||
Val | M【44+x3】 | F4 | M【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 | √3 | 6 | |
fsub.d f8, f2, f4 | √4 | 6 | |
fdiv.d f8, f0, f6 | √5 | ||
fadd.d f6, f8, f2 | √6 |
保留站
名称 | Busy | op | Vj | Vk | Qj | QK | A |
---|---|---|---|---|---|---|---|
Load1 | No | ||||||
Load2 | No | ||||||
1 Add1 | Yes | sub | M【44+x3】 | F4 | |||
Add2 | Yes | add | M【44+x3】 | Mult2 | |||
Add3 | No | ||||||
9 Mult1 | Yes | mul | M【44+x3】 | F4 | |||
Mult2 | Yes | div | M【32+x2】 | Mult1 |
寄存器状态:设f4初始值为F4
字段 | f0 | f2 | f4 | f6 | f8 | f10 | f12 | ∙ ∙ ∙ | f30 |
---|---|---|---|---|---|---|---|---|---|
Qi | Mult1 | Add2 | Mult2 | ||||||
Val | M【44+x3】 | F4 | M【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 | √3 | 7 | |
fsub.d f8, f2, f4 | √4 | √7 | |
fdiv.d f8, f0, f6 | √5 | ||
fadd.d f6, f8, f2 | √6 |
保留站
名称 | Busy | op | Vj | Vk | Qj | QK | A |
---|---|---|---|---|---|---|---|
Load1 | No | ||||||
Load2 | No | ||||||
Add1 | Yes | sub | M【44+x3】 | F4 | |||
Add2 | Yes | add | M【44+x3】 | Mult2 | |||
Add3 | No | ||||||
8 Mult1 | Yes | mul | M【44+x3】 | F4 | |||
Mult2 | Yes | div | M【32+x2】 | Mult1 |
寄存器状态:设f4初始值为F4
字段 | f0 | f2 | f4 | f6 | f8 | f10 | f12 | ∙ ∙ ∙ | f30 |
---|---|---|---|---|---|---|---|---|---|
Qi | Mult1 | Add2 | Mult2 | ||||||
Val | M【44+x3】 | F4 | M【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 | √3 | 8 | |
fsub.d f8, f2, f4 | √4 | √7 | √8 |
fdiv.d f8, f0, f6 | √5 | ||
fadd.d f6, f8, f2 | √6 |
保留站
名称 | Busy | op | Vj | Vk | Qj | QK | A |
---|---|---|---|---|---|---|---|
Load1 | No | ||||||
Load2 | No | ||||||
Add1 | No | ||||||
Add2 | Yes | add | M【44+x3】 | Mult2 | |||
Add3 | No | ||||||
7 Mult1 | Yes | mul | M【44+x3】 | F4 | |||
Mult2 | Yes | div | M【32+x2】 | Mult1 |
寄存器状态:设f4初始值为F4
字段 | f0 | f2 | f4 | f6 | f8 | f10 | f12 | ∙ ∙ ∙ | f30 |
---|---|---|---|---|---|---|---|---|---|
Qi | Mult1 | Add2 | Mult2 | ||||||
Val | M【44+x3】 | F4 | M【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 |
保留站
名称 | Busy | op | Vj | Vk | Qj | QK | A |
---|---|---|---|---|---|---|---|
Load1 | No | ||||||
Load2 | No | ||||||
Add1 | No | ||||||
Add2 | Yes | add | M【44+x3】 | Mult2 | |||
Add3 | No | ||||||
Mult1 | Yes | mul | M【44+x3】 | F4 | |||
Mult2 | Yes | div | M【32+x2】 | Mult1 |
寄存器状态:设f4初始值为F4
字段 | f0 | f2 | f4 | f6 | f8 | f10 | f12 | ∙ ∙ ∙ | f30 |
---|---|---|---|---|---|---|---|---|---|
Qi | Mult1 | Add2 | Mult2 | ||||||
Val | M【44+x3】 | F4 | M【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 |
保留站
名称 | Busy | op | Vj | Vk | Qj | QK | A |
---|---|---|---|---|---|---|---|
Load1 | No | ||||||
Load2 | No | ||||||
Add1 | No | ||||||
Add2 | Yes | add | M【44+x3】 | Mult2 | |||
Add3 | No | ||||||
Mult1 | No | ||||||
10-【更正为40】 Mult2 | Yes | div | M【44+x3】*F4 | M【32+x2】 |
寄存器状态:设f4初始值为F4
字段 | f0 | f2 | f4 | f6 | f8 | f10 | f12 | ∙ ∙ ∙ | f30 |
---|---|---|---|---|---|---|---|---|---|
Qi | Add2 | Mult2 | |||||||
Val | M【44+x3】*F4 | M【44+x3】 | F4 | M【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 |
保留站
名称 | Busy | op | Vj | Vk | Qj | QK | A |
---|---|---|---|---|---|---|---|
Load1 | No | ||||||
Load2 | No | ||||||
Add1 | No | ||||||
Add2 | Yes | add | M【44+x3】 | Mult2 | |||
Add3 | No | ||||||
Mult1 | No | ||||||
Mult2 | Yes | div | M【44+x3】*F4 | M【32+x2】 |
寄存器状态:设f4初始值为F4
字段 | f0 | f2 | f4 | f6 | f8 | f10 | f12 | ∙ ∙ ∙ | f30 |
---|---|---|---|---|---|---|---|---|---|
Qi | Add2 | Mult2 | |||||||
Val | M【44+x3】*F4 | M【44+x3】 | F4 | M【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 |
保留站
名称 | Busy | op | Vj | Vk | Qj | QK | A |
---|---|---|---|---|---|---|---|
Load1 | No | ||||||
Load2 | No | ||||||
Add1 | No | ||||||
2 Add2 | Yes | add | M【44+x3】*F4 / M【32+x2】 | M【44+x3】 | |||
Add3 | No | ||||||
Mult1 | No | ||||||
Mult2 | No |
寄存器状态:设f4初始值为F4
字段 | f0 | f2 | f4 | f6 | f8 | f10 | f12 | ∙ ∙ ∙ | f30 |
---|---|---|---|---|---|---|---|---|---|
Qi | Add2 | ||||||||
Val | M【44+x3】*F4 | M【44+x3】 | F4 | M【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】 |
保留站
名称 | Busy | op | Vj | Vk | Qj | QK | A |
---|---|---|---|---|---|---|---|
Load1 | No | ||||||
Load2 | No | ||||||
Add1 | No | ||||||
Add2 | Yes | add | M【44+x3】*F4 / M【32+x2】 | M【44+x3】 | |||
Add3 | No | ||||||
Mult1 | No | ||||||
Mult2 | No |
寄存器状态:设f4初始值为F4
字段 | f0 | f2 | f4 | f6 | f8 | f10 | f12 | ∙ ∙ ∙ | f30 |
---|---|---|---|---|---|---|---|---|---|
Qi | Add2 | ||||||||
Val | M【44+x3】*F4 | M【44+x3】 | F4 | M【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】 |
②保留站
名称 | Busy | op | Vj | Vk | Qj | QK | A |
---|---|---|---|---|---|---|---|
Load1 | No | ||||||
Load2 | No | ||||||
Add1 | No | ||||||
Add2 | No | ||||||
Add3 | No | ||||||
Mult1 | No | ||||||
Mult2 | No |
对比记分牌的保留站
名称 | Busy | op | Fi | Fj | FK | Qj | QK | Rj | RK |
---|---|---|---|---|---|---|---|---|---|
Integer | No | ||||||||
Add1 | No | ||||||||
Add2 | No | ||||||||
Add3 | No | ||||||||
Mult1 | No | ||||||||
Mult2 | No |
③寄存器状态:设f4初始值为F4
字段 | f0 | f2 | f4 | f6 | f8 | f10 | f12 | ∙ ∙ ∙ | f30 |
---|---|---|---|---|---|---|---|---|---|
Qi | |||||||||
Val | M【44+x3】*F4 | M【44+x3】 | F4 | M【44+x3】+ (M【44+x3】*F4 / M【32+x2】) | M【44+x3】*F4 / M【32+x2】 |
对比记分牌的寄存器状态
字段 | f0 | f2 | f4 | f6 | f8 | f10 | f12 | ∙ ∙ ∙ | f30 |
---|---|---|---|---|---|---|---|---|---|
Qi | |||||||||
Val | M【44+x3】*F4 | M【44+x3】 | F4 | M【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)每条指令的功能
序号 | 指令 | 功能 |
---|---|---|
1 | ld x1, 80(x2) | 加载双字(64位);从内存地址为 80+Regs[x2] 处读8个字节,存到寄存器 x1 |
2 | lw x1, 60(x2) | 加载字(32位);从内存地址为 60+Regs[x2] 处读4个字节,经符号位扩展后,存到寄存器 x1 |
3 | lwu x1, 60(x2) | 无符号加载字(32位);从内存地址为 60+Regs[x2] 处读4个字节,经零扩展后,存到寄存器 x1 |
4 | lb x1, 40(x3) | 加载字节(8位);从内存地址为 40+Regs[x3] 处读1个字节,经符号位扩展后,存到寄存器 x1 |
5 | lbu x1, 40(x3) | 无符号加载字节(8位);从内存地址为 40+Regs[x3] 处读1个字节,经零扩展后,存到寄存器 x1 |
6 | lh x1, 40(x3) | 加载半字(16位);从内存地址为 40+Regs[x3] 处读取2个字节,经符号位扩展后,存到寄存器 x1 |
7 | flw f0, 50(x3) | 加载单精度浮点数;从内存地址为 50+Regs[x3] 处读4个字节,存到浮点寄存器 f0 中(在f0中对齐) |
8 | fld f0, 50(x2) | 加载双精度浮点数;从内存地址为 50+Regs[x2] 处读8个字节,存到浮点寄存器 f0 中 |
9 | sd x2, 400(x3) | 存储双字(64位);将寄存器 x2 中的数据,存储到内存地址为 400+Regs[x3] 处 |
10 | sw x3, 500(x4) | 存储字(32位);将寄存器 x3 中的数据的低 32 位,存储到内存地址为 500+Regs[x4] 处。 |
11 | fsw f0, 40(x3) | 存储单精度浮点数;将浮点寄存器 f0 中的数据,转换成4字节的单精度浮点数形式,存储到内存地址为 40+Regs[x3] 处 |
12 | fsd f0, 40(x3) | 存储双精度浮点数;将浮点寄存器 f0 中的数据,存储到内存地址为 40+Regs[x3] 处 |
13 | sh x3, 502(x2) | 存储半字(16位);将寄存器 x3 中的数据的低 16 位,存储到内存地址为 502+Regs[x2] 处 |
14 | sb x2, 41(x3): | 存储字节(8位);将寄存器 x2 中的数据的低 8 位,存储到内存地址为 41+Regs[x3] 处 |
ASNWER:
(2)ISA 设计的正交性原则
- 正交性原则的定义: 指令集中的各个部分之间彼此独立,不存在功能上的重叠或冲突。
- 在这些加载和存储指令中,正交性原则体现在:
- 指令功能没有冲突:每个指令都有自己独特的功能,不会与其他指令的功能发生冲突。例如加载双字、加载字、加载半字、加载字节等
- 指令功能没有重叠:每个指令都提供了唯一的功能,没有冗余或重叠的部分。例如,lw和lb指令都是加载数据到寄存器,但一个是加载字,一个是加载字节,它们的功能互相独立,没有重复。
- 指令操作对象独立:不同的加载和存储指令操作不同的数据类型(如双字、字、半字、字节、单精度浮点数、双精度浮点数),并且每个指令的操作对象(寄存器或内存)都是独立的,彼此之间没有交叉或冲突。
- 一致的指令格式:尽管指令的功能各不相同,但它们都遵循了统一的指令格式和寻址模式。这种一致性使得指令的编码和解码更加简单和高效。
- Load、Store为I、S型指令
- 相应的指令编码
-
32位
-
64位
-
ANSWER: