SchoolWork-LaTeX/计算机系统结构/平时作业/第四章作业.tex

288 lines
15 KiB
TeX
Raw Permalink Normal View History

2024-09-02 17:47:53 +08:00
\documentclass[全部作业]{subfiles}
\input{mysubpreamble}
\setcounter{chapter}{3}
\begin{document}
\chapter{处理器}
\begin{enumerate}
\questionandanswer[4.7]{
假设用来实现处理器数据通路的各功能模块延迟如下所示:
\noindent{\footnotesize\sffamily
\begin{tabularx}{\linewidth}{ZZZZZZZZZZ}
\toprule
I-Mem / D-Mem & Register File & Mux & ALU & Adder & Single gate & Register Read & Register Setup & Sign extend & Control \\
\midrule
250 ps & 150 ps & 25 ps & 200 ps & 150 ps & 5 ps & 30 ps & 20 ps & 50 ps & 50 ps \\
\bottomrule
\end{tabularx}
}
其中寄存器读延迟指的是时钟上升沿到寄存器输出端稳定输出新值所需的时间。该延迟仅针对PC寄存器。寄存器建立时间指的是寄存器的输入数据稳定到时钟上升沿所需的时间。该数值针对PC寄存器和寄存器堆。
}{}
\begin{enumerate}
\questionandanswer[4.7.1]{
[ 5 ]<4.4>R型指令的延迟是多少?比如,如果想让这类指令工作正确,时钟周期最少为多少?
}{
R型指令的步骤如下图所示。其中在译码阶段Control的延迟为50psRegister File的延迟为150psMux的延迟为25ps由于这三个步骤可以同时执行所以延迟取最大值即150ps。在访存MEM阶段由于R型指令不需要访问内存所以只需要通过一个多路选择器MUX所以延迟为25ps。
\includexopp[1.2]{4.7.1.1}
因此,延迟为$325+150+200+25+20 = 720$ ps即如果想让这类指令工作正确时钟周期最少为$720$ ps。
}
\questionandanswer[4.7.2]{
[ 10 ]<4.4>ld指令的延迟是多少?仔细检查你的答案,许多学生会在关键路径上添加额外的寄存器。
}{
ld指令的步骤如下图所示可以观察到在译码步骤中虽然延迟的组成部分和上一题不一样但由于Register File的延迟较长因此总的延迟还是由Register File决定即150ps。IF、ID、EX步骤的延迟与上一题没有改变但后面两个步骤有所改变。
\includexopp[1.2]{4.7.2.1}
因此,延迟为$325+150+200+275+20 = 970$ ps。
}
\questionandanswer[4.7.3]{
[ 10 ]<4.4>sd指令的延迟是多少?仔细检查你的答案,许多学生会在关键路径上添加额外的寄存器。
}{
前三个步骤仍然与之前一样在MEM中只需要访问D-Mem即250 ps并且没有WB步骤所以延迟为$325+150+200+250 = 925$ ps。
}
\questionandanswer[4.7.4]{
[ 5 ]<4.4> beq指令的延迟是多少?
}{
前三个步骤仍然与之前一样只需要在MEM中加入一个Single gate的延迟并且没有WB步骤。
\includexopp[3]{4.7.4.1}
因此,延迟为$325+150+200+5=680$ ps。
}
\questionandanswer[4.7.5]{
[ 5 ]<4.4>I型指令的延迟是多少?
}{
与R型指令类似I型指令只是在ID阶段需要在MUX前加入Sign extend的延迟但仍然没有Register File的延迟大所以ID步骤仍然需要150 ps的延迟所以总延迟仍然为 720 ps。
}
\questionandanswer[4.7.6]{
[ 5 ]<4.4>该CPU的最小时钟周期是多少?
}{
由于延迟最长的指令为ld指令所以该CPU的最小时钟周期为ld指令的延迟即970 ps。
}
\end{enumerate}
\questionandanswer[4.8]{
[ 10 ]<4.4>假设你能设计一款处理器并让每条指令执行不同的周期数。给定指令比例如下表所示相比图4-21中的处理器这款新处理器的加速比是多少?
\begin{center}
\begin{tabular}{cccc}
\toprule
R-type/I-type (non-ld) & ld & sd & beq \\
\midrule
$52\%$ & $25\%$ & $11\%$ & $12\%$ \\
\bottomrule
\end{tabular}
\end{center}
}{
R型指令和I型指令没有MEM阶段ld指令5个阶段都有sd指令没有WB阶段beq指令没有MEM和WB阶段。可以认为一个阶段的执行需要一个时钟周期如果所有指令执行相同的周期数那么都需要5个时钟周期而如果每条指令可以执行不同的周期数那么各类指令的周期数之比为R/I:4/5ld:1sd:4/5beq:3/5。将各类指令的周期比按照指令比例加权平均即可得到周期比
$$
\frac{4}{5}\times 0.52+1\times 0.25+\frac{4}{5}\times 0.11+\frac{3}{5}\times 0.12 = 0.826
$$
取倒数即可得到加速比:$\displaystyle \frac{1}{0.826} = \frac{500}{413} \approx 1.21065375302663$
}
\questionandanswer[4.16]{
在本题中将讨论流水线如何影响处理器的时钟周期。假设数据通路的各个流水级的延迟如下:
\begin{center}
\begin{tabular}{ccccc}
\toprule
IF & ID & EX & MEM & WB \\
\midrule
250ps & 350ps & 150ps & 300ps & 200ps \\
\bottomrule
\end{tabular}
\end{center}
同时,假设处理器执行的指令分布如下:
\begin{center}
\begin{tabular}{cccc}
\toprule
ALU/Logic & Jump/Branch & Load & Store \\
\midrule
$45\%$ & $20\%$ & $20\%$ & $15\%$ \\
\bottomrule
\end{tabular}
\end{center}
}{}
\begin{enumerate}
\questionandanswer[4.16.1]{
[ 5 ]<4.5>在流水化和非流水的处理器中,时钟周期分别是多少?
}{
流水化的处理器按照最长的阶段即350ps\\
非流水化的处理器:所有阶段延迟之和,即$250+350+150+300+200=1250$ ps。
}
\questionandanswer[4.16.2]{
[ 10 ]<4.5 >在流水化和非流水的处理器中对于ld指令的延迟分别是多少?
}{
ld指令5个阶段都有在流水化的处理器中$350\times 5 = 1750$ ps\\
非流水化的处理器中,为所有阶段延迟之和,即$250+350+150+300+200=1250$ ps。
}
\questionandanswer[4.16.3]{
[ 10 ]<4.5>如果我们将数据通路中的一个流水级拆成两个新流水级,每一个新流水级的延迟是原来的一半,那么我们将拆分哪一级?新处理器的时钟周期是多少?
}{
应该拆分最长的一级即ID阶段拆分之后最长的阶段延迟为300 ps所以新处理器的时钟周期是300 ps。
}
\questionandanswer[4.16.4]{
[ 10 ]<4.5>假设没有停顿或冒险,数据存储的利用率如何?
}{
既然题目中出现了“停顿”“冒险”这种只有在流水化处理器中才会出现的情况那么说明这里只需要考虑流水化的情况。数据存储对应的是MEM阶段MEM阶段只需要300ps但是为了满足流水线延迟到了350ps所以MEM阶段的利用率为$\frac{300}{350}$而在题目给出的指令分布中只有Load和Store指令会用到数据存储$20\%+15\%$,所以数据存储的利用率为
$$
\frac{300}{350} \times (0.2+0.15) = 0.3
$$
}
\questionandanswer[4.16.5]{
[ 10 ]<4.5>假设没有停顿或冒险,寄存器堆的写口利用率如何?
}{
寄存器堆的写口对应的是WB阶段WB阶段的利用率为$\frac{200}{350}$在题目给出的指令分布中使用到寄存器堆的写口的指令为ALU/Logic和Load$45\%+20\%$,所以寄存器堆写口的利用率为
$$
\frac{200}{350} \times (0.45+0.2) = \frac{13}{35} \approx 0.371428571428571
$$
}
\end{enumerate}
\questionandanswer[4.18]{
[ 5 ]<4.5>假设初始化寄存器x11为11,x12为22如果在4.5节中的流水线结构上执行下述代码寄存器x13和x14中最终为何值?注:硬件不处理数据冒险编程者需要在必要处插入NOP指令来解决数据冒险。
}{}
\begin{minted}{asm}
addi x11, x12, 5
add x13, x11, x12
addi x14, x11, 15
\end{minted}
{\kaishu
显然在硬件不处理数据冒险情况下执行上述代码会出现数据冒险以下是示意图在ID指令旁边标注了实际取出的操作数。
\includexopp[1.5]{4.18.1}
所以寄存器x13最终为33寄存器x14最终为26。
}
\questionandanswer[4.22]{
[ 5 ]<4.5>对于如下的RISC-V的汇编片段:
}{}
\begin{minted}{asm}
sd x29, 12(x16)
ld x29, 8(x16)
sub x17, x15, x14
beqz x17, label
add x15, x11, x14
sub x15, x30, x14
\end{minted}
\begin{enumerate}
\questionandanswer[4.22.1]{
[ 5 ]<4.5>请画出流水线图,说明以上代码会在何处停顿。
}{
在加入停顿之前的流水线图是这样的显然由于前面的指令的MEM阶段和后面的指令的IF阶段都需要访问存储器会发生结构冒险。
\includexopp[1.1]{4.22.1.1}
加入停顿后流水线图变成了这样:
\includexopp{4.22.1.2}
}
\questionandanswer[4.22.2]{
[ 5 ]<4.5>是否可通过重排代码来减少因结构冒险而导致停顿的次数?
}{
可以由于只考虑结构冒险即两条指令在同一个阶段访问寄存器堆或存储器的冒险可以把第一行的sd指令放到第二三行的ld和sub指令后面这样就可以减少一个停顿。
}
\questionandanswer[4.22.3]{
[ 5 ]<4.5>该结构冒险必须用硬件来解决吗?我们可以通过在代码中插入NOP指令来消除数据冒险对于结构冒险是否可以相同处理?如果可以,请解释原因。否则,也请解释原因。
}{
不一定要用硬件来解决可以通过插入NOP指令来消除结构冒险因为NOP指令相当于一个停顿只需要把上述的停顿换成NOP指令即可。
}
\questionandanswer[4.22.4]{
[ 5 ]<4.5>在典型程序中,大约需要为该结构冒险产生多少个周期的停顿?(使用习题4.8中的指令分布)。
}{
仔细观察可以发现停顿的产生是由于sd和ld有MEM阶段会和后续指令的IF阶段冲突ld和R型指令有WB阶段会和后续指令的ID阶段冲突那么可以认为一个ld导致2个停顿一个sd导致1个停顿一个R型导致1个停顿。所以大概产生的停顿周期数为
$$
1\times 0.52+2\times 0.25+1\times 0.11 = 1.13
$$
即产生$1.13\times \text{原始时钟周期数}$ 个周期的停顿。
}
\end{enumerate}
\questionandanswer[4.27]{
讨论下述指令序列,假设在一个五级流水的数据通路中执行:
}{}
\begin{minted}{asm}
add x15, x12, x11
ld x13, 4(x15)
ld x12, 0(x2)
or x13, x15, x13
sd x13, 0(x15)
\end{minted}
\begin{enumerate}
\questionandanswer[4.27.1]{
[ 5 ]<4.7>如果没有前递逻辑或者冒险检测支持请插入NOP指令保证程序正确执行。
}{}
{\kaishu
\begin{minted}{asm}
add x15, x12, x11 // 在第5个阶段写入x15
nop
nop
ld x13, 4(x15) // 在第2个阶段读取x15在第5个阶段写入x13
ld x12, 0(x2) // 在第2个阶段读取x2在第5个阶段写入x12
nop
or x13, x15, x13 // 在第2个阶段读取x13和x15在第5个阶段写入x13
nop
nop
sd x13, 0(x15) // 在第2个阶段读取x13和x15
\end{minted}
}
\questionandanswer[4.27.2]{
[ 10 ]<4.7>对代码进行重排插入最少的NOP指令。假设寄存器x17可用来做临时寄存器。
}{}
{\kaishu
\begin{minted}{asm}
add x15, x12, x11
nop
nop
ld x13, 4(x15)
ld x12, 0(x2)
nop
or x17, x15, x13
sd x17, 0(x15)
\end{minted}
}
\questionandanswer[4.27.3]{
[ 10 ]<4.7>如果处理器中支持前递,但未实现冒险检测单元,上述代码段的执行将会发生什么?
}{
不会发生数据冒险因为在不存在加载后马上使用的情况第二行加载到x13后在第4行才使用x13此时已经可以使用前递确保正确执行。
}
\questionandanswer[4.27.4]{
[ 20 ]<4.7>以图4-58中的冒险检测和前递单元为例如果执行上述代码在前7个时钟周期中每周期哪些信号会被它们置为有效?
}{
\includexopp[1.2]{4.27.4.1}
前递信号如图所示。所以在前7个时钟周期中有效信号表示如下表
\begin{center}
\begin{tabular}{cccc}
\toprule
时钟周期 & 冒险检测 & ForwardA & ForwardB \\
\midrule
1 & x & x & x \\
2 & x & x & x \\
3 & 有效 & 有效 & x \\
4 & x & x & x \\
5 & 有效 & x & 有效 \\
6 & 有效 & 有效 & x \\
7 & x & x & x \\
\bottomrule
\end{tabular}
\end{center}
}
\questionandanswer[4.27.5]{
[ 10 ]<4.7>如果没有前递单元以图4-58中的冒险检测逻辑为例需要为其增加哪些输入和输出信号?
}{
第3个周期的前递需要IF/ID.Rs1 和 ID/EX.Rd的输入信号ForwardA的输出信号\\
第5个周期的前递需要IF/ID.Rs2 和 EX/MEM.Rd的输入信号ForwardB的输出信号\\
第6个周期的前递需要IF/ID.Rs1 和 ID/EX.Rd的输入信号ForwardA的输出信号。\\
综上所述需要增加IF/ID.Rs1, IF/ID.Rs2, ID/EX.Rd, EX/MEM.Rd 的输入信号ForwardA, ForwardB的输出信号。
}
\questionandanswer[4.27.6]{
[ 20 ]<4.7>如果使用习题4.26.5中的冒险检测单元执行上述代码在前5个时钟周期中,每个周期哪些输出信号会有效?
}{
\includexopp[1.2]{4.27.4.1}
前递信号如图所示。所以在前5个时钟周期中有效信号表示如下表
\begin{center}
\begin{tabular}{cccc}
\toprule
时钟周期 & 冒险检测 & ForwardA & ForwardB \\
\midrule
1 & x & x & x \\
2 & x & x & x \\
3 & 有效 & 有效 & x \\
4 & x & x & x \\
5 & 有效 & x & 有效 \\
\bottomrule
\end{tabular}
\end{center}
}
\end{enumerate}
\end{enumerate}
\end{document}