一、 CPU 运行时间(10 分)
1.1 CPU 运行时间公式
1.1 写出 CPU 运行时间公式, 哪些因素会影响以上分量?
结合计算机体系结构的发展趋势分析哪些技术通过影响以上分量降低了 CPU 的运行时间。(6 分)
(1)CPU运行时间公式:
CPU执行时间 = (CPU时钟周期数+存储器停顿周期数) x 时钟周期时间
其中CPU周期数为IC(指令数) x CPI
ANSWER:
CPU运行时间 = (CPI × 执行指令数 × 时钟周期)
其中,
- CPI(Cycles Per Instruction):
- 表示每条指令需要的时钟周期数;
- 受到CPU体系结构和指令集的影响。不同的CPU体系结构和指令集对于同样的操作可能需要不同数量的时钟周期,因此CPI也会不同
- 执行指令数:
- 表示需要执行的指令数量;
- 受到应用程序的特性和优化程度的影响。相同的应用程序在不同的实现中可能需要执行不同数量的指令。
- 时钟周期:
- 表示CPU时钟周期。
- 受到CPU的制造工艺和微架构设计的影响。更先进的制造工艺和更高效的微架构设计可以使CPU的时钟周期更短。
(2)影响技术
- 流水线技术:
- 指令执行划分为多个阶段,多条指令以流水线的形式同时执行;同时分支预测、数据转发会减少存储器停顿周期数
- 提高CPU吞度量,减少CPI、存储器停顿周期数
- 超标量技术:
- 允许CPU在一个时钟周期内同时发射多条指令
- 并行执行,减少CPI
- 缓存优化:
- 通过Cache的优化,减少命中时间、缺失率、缺失代价
- 减少存储器停顿周期数
ANSWER:
- 超标量技术:通过在同一时钟周期内同时执行多个指令,降低了CPI。
- 乱序执行技术:允许CPU以任意顺序执行指令,从而提高了指令级并行度,降低了CPI。
- 预测执行技术:通过预测程序的分支和数据依赖关系,使CPU能够提前执行指令,从而降低了CPI。
- 高速缓存技术:将常用的数据和指令存储在高速缓存中,减少了内存访问的次数,降低了执行指令数。
- 动态电压调节技术:根据CPU的工作负载调节供电电压,提高了CPU的能效和稳定性,从而提高了时钟频率,降低时钟周期。
1.2 量化方法的三个原则
1.2 简述量化方法的三个原则。 流水线使用了哪些原则。(4 分)
(1)量化方法的三个原则
- 充分利用并行
- 系统级别利用并行:多处理器,多存储设备
- 数据集并行:多存储设备实现并行读写
- 指令级并行:流水线 ;循环展开
- 局部性原理
- 时间局部性:某条指令/数据一旦执行/访问,则不久之后该指令/数据可能再次被执行/访问
- 空间局部性:访问了某个存储单元,不久之后,其附近的存储单元也将被访问
- 重点关注常见情形:Amdahl定律
ANSWER:
- 1、充分利用并行。
- 2、局部性原理。
- 3、重点关注常见情形
(2)流水线用到的原则
- 指令级并行:现代处理器通过流水线来实现指令级并行(ILP),提高性能。
- 分支预测:减少控制冒险,及其导致的停顿【重点关注常见情形】
- 局部性原理:数据转发forward可以利用相邻指令间的数据的时间局部性
ANSWER:
流水线使用了充分利用并行原则。
二、加速比(10 分)
2.1求 总的加速比Speed-up-overall
2.1 假设一个任务的运行时间包括 3 部分, 时间占比分别为 Fraction1, Fraction2, Fraction3, 对应的加速比 为 Speedup1, Speedup2, Speedup3 分 。 求 总的加速比Speed-up-overall。(5 分)
S
p
e
e
d
u
p
i
=
T
o
d
d
i
T
n
e
w
i
所以:
T
n
e
w
i
=
T
o
d
d
i
S
p
e
e
d
u
p
i
=
T
o
d
d
∗
F
r
a
c
t
i
o
n
i
S
p
e
e
d
u
p
i
Speedup_{i}=\frac{Todd_{i}}{Tnew_{i}} \\ 所以:Tnew_{i}=\frac{Todd_{i}}{Speedup_{i}}=Todd*\frac{Fraction_{i}}{Speedup_{i}}
Speedupi=TnewiToddi所以:Tnewi=SpeedupiToddi=Todd∗SpeedupiFractioni
T
n
e
w
=
∑
i
=
1
N
T
n
e
w
i
=
T
o
d
d
∗
∑
i
=
1
N
F
r
a
c
t
i
o
n
i
S
p
e
e
d
u
p
i
Tnew=\sum _{i=1}^{N}Tnew_{i}=Todd*\sum _{i=1}^{N}\frac{Fraction_{i}}{Speedup_{i}}
Tnew=i=1∑NTnewi=Todd∗i=1∑NSpeedupiFractioni
S
p
e
e
d
u
p
o
v
e
r
a
l
l
=
T
o
d
d
T
n
e
w
=
1
∑
i
=
1
N
F
r
a
c
t
i
o
n
i
S
p
e
e
d
u
p
i
Speedup_{overall}=\frac{Todd}{Tnew}=\frac{1}{\sum _{i=1}^{N}\frac{Fraction_{i}}{Speedup_{i}}}
Speedupoverall=TnewTodd=∑i=1NSpeedupiFractioni1
ANSWER:
2.2 土豆悖论与 Amdahl’s 定律
2.2 土豆悖论与 Amdahl’s 定律。
假设有一个程序有两个部分, 耗时分别为 99s 和 1s。
职员甲能用 2 个小时把第一部分的耗时降低 50%,职员乙能用 1 个小时把第二部分的耗时降低 90%。甲和乙都认为自己的贡献更大,分析他们的理由。(5 分)
T 1 = 99 , T 2 = 1 T 1 − 甲 = 99 ∗ 0.5 = 49.5 , T 1 − 乙 = 1 ∗ 0.1 = 0.1 S p e e d u p 总 − 甲 = 100 49.5 + 1 = 1.98 S p e e d u p 总 − 乙 = 100 99 + 0.1 = 1.01 T_{1}=99,T_{2}=1 \\ T_{1-甲}=99*0.5=49.5,T_{1-乙}=1*0.1=0.1 \\ Speedup_{总-甲}=\frac{100}{49.5+1}=1.98 \\ Speedup_{总-乙}=\frac{100}{99+0.1}=1.01 T1=99,T2=1T1−甲=99∗0.5=49.5,T1−乙=1∗0.1=0.1Speedup总−甲=49.5+1100=1.98Speedup总−乙=99+0.1100=1.01
- 甲的贡献大:【Amdahl’s 定律】甲优化的时间更少,加速比更大,整体的结果更优
- 乙的贡献大:【土豆悖论】对部分的优化幅度更大,局部的优化比例更大
ANSWER:
- 职员甲的观点: Amdahl’s定律:当提升系统的一部分性能时,对整个系统性能的影响取决于:1、这一部分有多重要 2、这一部分性能提升了多少。
- 职员甲优化第一部分后,程序整体性能提升的倍数为1.98;
- 职员乙优化第二部分后,程序整体性能提升的倍数1.009;
- 尽管职员乙将第二部分加速了10倍,但对整体程序帮助不大,所以甲的贡献较大。
- 职员乙的观点:土豆悖论: 假设有1000斤的土豆,然后这些土豆的水分含量是99%,只有1%是干货,把土豆风干一下,使它的含水量下降到98%,要风干500斤的水。
- 职员甲花了10个小时,其优化的部分由原来的99%变成97.8%;
- 职员乙则花了2个小时,其优化部分由原来的1%变成0.1%,时间短,效果显著。
三、数据并行和任务并行(10 分)
3.1 数据并行和任务并行的区别
3.1 简述数据并行和任务并行的区别。
举一个你身边的例子, 分别给出基于数据并行和任务并行的解决方案。(5 分)
- 数据级并行:
- 定义:将数据集合分成多个部分,然后并行地对这些数据部分进行处理
- 特点:每个处理单元执行相同的操作,但是操作的对象是不同的数据片段
- 举例:处理一系列文档的数据分析和处理任务:
如果任务是对每个文档进行相同的数据分析处理,则每个人负责处理不同部分的文档,但执行的数据分析操作是相同的。
- 任务级并行:
- 定义:将整个计算任务分解成多个独立的子任务,并行地执行这些子任务
- 特点:每个处理单元执行不同的操作,各自负责不同的子任务
- 举例:处理一系列文档的数据分析和处理任务:
如果任务是对文档进行不同种类的处理,则可以将整个处理过程划分为不同的任务,并行地执行,比如一部分人负责文本分析,另一部分人负责图像处理
ANSWER:
- 数据并行和任务并行是两种常见的并行计算方法。它们的区别在于并行处理的对象不同。
- 数据并行:
- 将数据划分为多个部分,同时将每个部分分配给不同的处理器进行处理,最后将结果合并。
- 在数据并行中,每个处理器都处理相同的操作,但处理的数据不同。
- 数据并行常用于处理大规模的数据集,例如机器学习的训练过程。
- 任务并行:
- 将任务分解为多个子任务,并将每个子任务分配给不同的处理器执行。
- 在任务并行中,每个处理器执行不同的操作,但所有操作都是为了完成同一个任务。
- 任务并行通常用于复杂的计算任务,例如在一个大型项目中并行执行多个计算任务。
- 例子言之有理即可。
3.2 计算机的发展趋势
3.2 阐述教材图 1.9 所表示的计算机的发展趋势, 分析为什么延迟的发展速度远远落后于吞吐量的发展速度。(5 分)
计算机的发展趋势:
- 过去的计算机设计技术随着集成电路逻辑技术,半导体技术,磁盘技术等的快速发展而迅猛提高。
- 然而现在随着摩尔定律的失效,技术提升的速度已经放缓了。
- 性能上:带宽的改进远大于延迟的改进,经验表明带宽的增长速度至少是延迟改进速度的平方
为什么延迟的发展速度远远落后于吞吐量的发展速度:
- 在硬件方面,近乎达到物理上限,如电子信号传输速度的上限、电路元件的响应时间等。
- 软件和硬件的复杂性增加,降低单个操作的延迟更加困难。需要考虑指令调度、缓存管理、并发控制等
- 吞吐量:提升更多地依赖于并行处理和多核技术,可以通过增加硬件资源来实现。
ANSWER:
- 延迟的发展速度远远落后于吞吐量的发展速度;
- 主要是因为计算机的吞吐量可以通过并行化来提高,而延迟却很难通过并行化来解决。
- 并行化可以同时执行多个任务,提高吞吐量
- 但是延迟是指执行单个任务所需的时间,而单个任务很难通过并行化来缩短时间。
- 此外,延迟还受到物理限制和技术瓶颈的影响。
- 例如电子信号在电路中传输的速度是有限的,而光信号的传输速度更快但技术复杂度和成本也很高,因此要突破延迟的瓶颈需要在技术、算法等方面做出更大的创新和突破
四、寻址方式(10 分)
4.1 列举5 种操作数的寻址方式
列举 5 种操作数的寻址方式。
5 种操作数的寻址方式:
- 立即数寻址:直接给出操作数的值,例如 LOAD R1, #10,表示将值 10 加载到寄存器 R1 中
- 寄存器寻址:例如 LOAD R1, R2,表示将寄存器 R2 中的值(R2)加载到寄存器 R1 中
- 直接寻址:给出操作数的地址,例如LOAD R1, (100),表示将内存地址为 100 处存储的值(M[100])加载到寄存器 R1 中
- 寄存器间接寻址:给出一个寄存器,其内容包含了操作数的地址,例如 LOAD R1, (R2),表示将寄存器 R2 中存储的地址所指向的值(M[R2])加载到寄存器 R1 中
- 变址寻址:给出一个基址寄存器和一个偏移量,用于计算操作数的地址,例如 LOAD R1, 100(R2),表示将基址寄存器 R2 中存储的值加上偏移量 100 所指向的地址指向的值(M[R2+100])加载到寄存器 R1 中。
4.2 指令执行后寄存器的值
假设寄存器 Ri 的初始化为 i + 2,地址 a 的内存初始化为(a + 3)mod 10。
依次执行以下指令后,给出每条指令执行后寄存器的值,仅回答 R1-R4 寄存器即可。
LB R1, 100(R1)
LB R2, (R1)
LB R3, (R3+R2)
LB R4, (1001)
寄存器的值:
指令 | R1 | R2 | R3 | R4 |
---|---|---|---|---|
初始 | 3 | 4 | 5 | 6 |
LB R1, 100(R1) | (103+3)mod 10=6 | 4 | 5 | 6 |
LB R2, (R1) | 6 | (6+3)mod 10=9 | 5 | 6 |
LB R3, (R3+R2) | 6 | 9 | (14+3)mod 10 =7 | 6 |
LB R4, (1001) | 6 | 9 | 7 | (1001+3)mod 10 =4 |
五、流水线机制(10分)
基于 RISC-V 的 5 级流水线机制,设计支持指令 Add R1,R2,100(R3)的 7 级流水线示意图。
分析为什么 RISC- V 设计为只有访存指令才能读写内存。(10分)
(1)7级流水线示意图
没想出来7级流水线,有个6级流水线的想法:
- IF
- ID
- ALU1:计算R3+100
- MEM:访问地址为(R3+100)的数据
- ALU2:计算M[R3+100]与R2的和
- WB:写回R1
ANSWER:
设计的7级流水线步骤包含核心的6个步骤即可。
IF,ID,EXE1(计算有效地址),MEM,EXE2(计算Add),WB
(2)只有访存指令能读写内存
- 简化流水线设计:减少流水线中的数据冒险和控制冒险;因为访存指令可能需要额外的处理逻辑(如地址计算、数据传输等);
- 降低处理器的复杂度:不是所有指令都需要直接与内存进行交互;
- 提高安全性和可控性:避免非法访问内存导致的安全问题;
- 遵循简洁性和规范性原则:RISC-V 尽量设计简洁、清晰和规范的指令集;
ANSWER:
- 在RISC-V 指令集中,对内存的读写只能通过LOAD 和STORE 指令实现。而其他的指令只能以寄存器为操作对象。
- 这样设计使得5级流水线的数据冲突和结构冲突更少,有利于提高流水线的效率
六、5 级流水线(10 分)
分析下列 7 条指令的 5 级流水线执行示意图(10 分)
表中第一行的列序号为周期
–条件跳转指令在 EX 阶段才知道最终的跳转指令位置;
–预测条件跳转指令不会选中(Untaken);
–当条件跳转指令执行时, $1 中的值等于$2 中的值。
2024/5/19更:第二条sub指令应该等第二条lw指令MEM后forward,才能EX;
lw指令:EX之后是0+$4,MEM之后才是M[0+$4]
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
beq $1,$2,X | IF | ID | EX | MEM | WB | |||||||
lw $10,0($11) | IF | ID | FLUSH | FLUSH | FLUSH | |||||||
sub $14,$10,$10 | IF | FLUSH | FLUSH | FLUSH | FLUSH | |||||||
X:add $4,$1,$2 | IF | ID | EX | MEM | WB | |||||||
lw $1,0($4) | IF | ID | EX | MEM | WB | |||||||
sub $1,$1,$1 | IF | ID | stall | EX | MEM | WB | ||||||
add $1,$1,$1 | IF | stall | ID | EX | MEM | WB |
ANSWER:
-
仅使用了stall技术的
-
-
考虑了转发和stall技术的:(第二条sub指令应该等第二条lw指令MEM后forward,才能EX)
-
七、五段流水线(10分)
根据教材的图 C.25 回答下列问题(10 分)
1)解释每个部件的作用。
2)分析指令Add R1,R2,R3是怎么执行的。
(1)各部件的作用
- PC:Program counter程序计数器;
- ADD(左):实现PC+4,即顺序执行的下一条指令的地址;
- Mux(左):分支跳转,选择下一条指令的地址或者跳转地址;
- Instruction memory:指令存储,根据PC取出当前指令,传给IF/ID;
- IF/ID:取指、译码,根据指令翻译出各种控制信号;
- Registers:寄存器堆,取操作数寄存器、写回的目的寄存器;
- Sign-extend:符号扩展,得到指令中需要的立即数;
- ADD(中):得到跳转地址;
- ID/EX:译码,执行
- =?:选择跳转地址的使能
- Mux(中):选择运算的操作数
- ALU:进行指令要求的运算
- EX/MEM:执行,访存
- Data Memory:数据存储,进行load/store;
- MEM/WB:访存,写回
- Mux(右):选择访存的数据,或者运算的数据写回到寄存器
ANSWER:
-
PC:程序计数器
-
ADD(左):产生下一个指令
-
MUX(左):多路选择器:选择跳转或PC+
-
Instruction memory:根据PC值读出指令
-
Registers:根据寄存器地址读写寄存器
-
ADD(中):计算PC跳转有效地址
-
Sign-extend:立即数符号扩展
-
ALU:逻辑计算单元
-
MUX(中):多路选择器:选择操作数
-
=?:分支选择器
-
Data memory: 根据地址读出/写入内存
-
MUX(右):多路选择器:选择写回数据
(2)指令Add R1,R2,R3的执行
- 取指
- 根据PC,选择Instruction Memory的指令Add R1,R2,R3,送到后续阶段;
- PC+4,变为下一条指令的地址
- 译码
- IR6…10,IR11…15设为R2,R3,传给Registers
- 同时将Add的控制信号传给后面的ALU,写回的目的寄存器R1传给后续阶段等
- 执行
- Mux选择寄存器,而非立即数,传给ALU
- ALU对R2,R3进行“加”操作,结果传给后续阶段
- 访存
- 本指令不需要访存
- 写回
- Mux选择传输过来的ALU运算的结果,进行写回
- 写回地址为R1,传给MEM/WB,IR
ANSWER:
讲清楚IF,ID,EXE,MEM,WB的动作即可
八、分支预测(10分)
根据教材图 C.15 回答下列问题(10 分)
1)图中所表示的机制是什么,为了解决什么问题?
2)画出类似的 3bit 8 状态的动态指令预测方式状态迁移图。
3)分析现代计算机为什么只选用 2bit 而不是更多 bit 的预测机制。
(1)2位分支预测
- 动态分支预测机制:2位分支预测器
- 解决问题:根据以往分支历史来预测分支的结果,从而尽量避免流水线停顿,提高处理器的性能和效率
- 状态11/10:预测跳转
- 状态00/01:预测不跳转
ANSWER:
- 2位预测机制。
- 动态分支预测机制中,简单的1位预测机制在性能上有一处短板:即使某个分支几乎总是被选中,在其未被选中时,我们也可能会得到两次错误的预测,而不是一次,因为错误预测会导致该预测位反转,2位预测机制就是为了弥补这个缺点。
(2)3bit 8状态的动态指令预测
另一解法的一点思考:
-
其实,一开始画的3bit 8状态的动态指令预测如下:
- -
还有一种Two-Bit Counter Based Predictor:计算机体系结构学习(5)——分支预测-[知乎_Maxine]
- -
评价:
- 后者比较简单,状态的编码转移,每次notTaken就-1,Taken就+1(边界处不变)
- 前者的状态转移比较少:以多次notTaken为例,前者最多4次notTaken就在状态000处,而后者最多需要7次才到000
ANSWER:
或:
(3)为什么只选用 2bit
- 基于性能和成本的平衡考虑。
- 增加预测位数会增加硬件成本和复杂性,而且可能带来边际收益的减少。
- 在实践中,2 位预测器已经被证明在大多数情况下能够提供良好的预测结果,并且在成本和性能之间找到了一个合理的折衷点。
ANSWER:
- 因为2位预测器的效果几乎与n位预测器相同;
- 所以大多数系统采用2位分支预测器,而不是更具一般性的n位预测器。
九、指令的二进制码表示(10分)
根据下图提供的 RISC-V 32I 手册,写出以下指令的二进制码表示(10 分)
Add R1, R2, R3
Addi R1, R2, 4
Sw R1, 100(R2)
Bge R15, R14, -68
所需指令对应 opcode:
- R型:寄存器-寄存器指令;主要是运算类的指令;
- I型:立即数指令;包括涉及立即数的运算、Load指令;
- S型指令(以及SB型):通常为存储指令和分支指令,
- U型指令(以及UJ型):用于实现跳转。
- 指令中包含了源寄存器(rs),目的寄存器(rd),这些字段在译码和写回时使用,读取或写入指定的寄存器。
(1)Add R1, R2, R3
指令 | 类型type | funct7-[31:25] | rs2-[24:20]-源寄存器2 | rs1-[19:15]-源寄存器1 | funct3-[14:12] | rd-[11:7]-目的寄存器 | opcode-[6:0]-操作码 |
---|---|---|---|---|---|---|---|
Add R1, R2, R3 | R-type | 000_0000 | 0_0011 | 0_0010 | 000 | 0_0001 | 011_0011 |
(2)Addi R1, R2, 4
指令 | 类型type | imm[11:0]-[31:20] | rs1-[19:15]-源寄存器1 | funct3-[14:12] | rd-[11:7]-目的寄存器 | opcode-[6:0]-操作码 |
---|---|---|---|---|---|---|
Addi R1, R2, 4 | I-type | 0000_0000_0100 | 0_0010 | 000 | 0_0001 | 001_0011 |
(3)Sw R1, 100(R2):100=64+32+4=0b0000_0110_0100
SW rs2,offset(rs1)。M[x[rs1] + sext(offset)]= x[rs2][31: 0]
指令 | 类型type | imm[11:5]-[31:25] | rs2-[24:20]-R1 | rs1-[19:15]-R2 | funct3-[14:12] | imm[4:0]-[11:7] | opcode-[6:0]-操作码 |
---|---|---|---|---|---|---|---|
Sw R1, 100(R2) | S-type | 0000_011 | 0_0001 | 0_0010 | 010 | 0_0100 | 010_0011 |
(4)Bge R15, R14, -68:
68=64+4=0b0000_0100_0100,-68的二进制补码为68的二进制数取反加一:0b1_1111_1011_1100
指令 | 类型type | imm[12|10:5]-[31:25] | rs2-[24:20]-R1 | rs1-[19:15]-R2 | funct3-[14:12] | imm[4:1|11]-[11:7] | opcode-[6:0]-操作码 |
---|---|---|---|---|---|---|---|
Bge R15, R14, -68 | B-type | 1_111101 | 0_1110 | 0_1111 | 101 | 1110_1 | 110_0011 |
ASNWER:
- 0000000 R3 R2 000 R1 0110011
- 00000000100 R2 000 R1 0010011
- 0000011 R2 R1 010 00100 0100011 (这里助教说改成R1在R2前)
- 1 11101 R14 R15 101 1110 1 1100011
十、数据冒险(data hazard)(10 分)
- 找出下面代码中所有的数据冒险;
找出的所有数据冒险,具体格式如: I5 指令和 I1 指令在 r2 上存在 RAW。
- RAW
- I2 指令和 I1 指令在 r2 上存在 RAW
- I3 指令和 I1 指令在 r2 上存在 RAW
- I4 指令和 I1 指令在 r2 上存在 RAW
- I5 指令和 I1 指令在 r2 上存在 RAW
- I4 指令和 I2 指令在 r4 上存在 RAW
- 画出没有转发(no forwarding)的流水线。
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
I1 | IF | ID | EX | MEM | WB | |||||||
I2 | IF | ID | stall | stall | EX | MEM | WB | |||||
I3 | IF | stall | stall | ID | EX | MEM | WB | |||||
I4 | IF | ID | Istall | EX | MEM | WB | ||||||
I5 | IF | stall | ID | EX | MEM | WB |
ANSWER:
- 无转发,无停顿
- 有停顿,无转发
- 画出有转发(forwarding)的流水线。
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | |
---|---|---|---|---|---|---|---|---|---|
I1 | IF | ID | EX | MEM | WB | ||||
I2 | IF | ID | EX | MEM | WB | ||||
I3 | IF | ID | EX | MEM | WB | ||||
I4 | IF | ID | EX | MEM | WB | ||||
I5 | IF | ID | EX | MEM | WB |
ANSWER: