\documentclass[全部作业]{subfiles} \input{mysubpreamble} \setcounter{chapter}{4} \begin{document} \begin{enumerate} \questionandanswer[5.11]{ 本题研究不同cache 设计的效果,特别是将组相联cache 与5.4节中的直接映射cache进行比较。有关这些练习,请参阅下面显示的字地址序列: \mint{C}|0x03, 0xb4, 0x2b, 0xbe, 0x58, 0xbf, 0x0e, 0x1f, 0xb5, 0xba, 0x2e, 0xce| }{} \begin{enumerate} \questionandanswer[5.11.1]{ [ 10 ]<5.4>绘制块大小为2字、总容量为48字的三路组相联cache 的组织结构图。图中应有类似于图5-18的样式,还应该清楚地显示标签和数据字段的宽度。 }{ \includexopp[1.1]{5.11.1.1} 块大小为$2=2^{1}$字,所以地址中的偏移量为1位。$48 \div 3 \div 2 = 8$,所以索引有$8=2^{3}$行,所以地址中的索引有3位。所以标签为$64-3-1 = \bm{60}$位。一个字应该是32位,并且块大小为2字,那么数据字段就是$2\times 32 = \bm{64}$位。 } \questionandanswer[5.11.2]{ [ 10 ]<5.4>从5.11.1中记录cache 的行为。假设cache使用LRU替换策略。对于每一次 cache访问,确定: \begin{itemize} \item 二进制字地址。 \item 标签。 \item 索引。 \item 偏移。 \item 访问会命中还是失效。 \item 在处理访问后,cache每一路中有哪些标签。 \end{itemize} }{ \includexopp[1.1]{5.11.2.1} 图中的Hit(命中)列用蓝色圈表示命中,命中时在上一行会有蓝色框表示命中了哪个缓存。红色下划线表示在这一时刻产生了缓存替换,标记了新的缓存放在哪个位置。 } \questionandanswer[5.11.3]{ [ 5 ]<5.4>绘制块大小为1字、总容量为8字的全相联cache 的组织结构图。图中应有类似于图5-18的样式,还应该清楚地显示标签和数据字段的宽度。 }{ \includexopp[1.1]{5.11.3.1} 地址是按字索引的,块大小是1字,所以没有偏移量。由于是全相联,所以没有索引位,所以标签为64位。总容量为8字,所以8个块排成一行。数据字段就是块大小即1字 $=$ 32位。 } \questionandanswer[5.11.4]{ [ 10 ]<5.4>从5.11.3中记录cache的行为。假设cache使用LRU替换策略。对于每一次 cache访问,确定: \begin{itemize} \item 二进制字地址。 \item 标签。 \item 索引。 \item 偏移。 \item 访问会命中还是失效。 \item 在处理访问后,cache每一路中有哪些标签。 \end{itemize} }{ \includexopp[1.1]{5.11.4.1} 图中的Hit(命中)列用蓝色圈表示命中,命中时在上一行会有蓝色框表示命中了哪个缓存。红色下划线表示在这一时刻产生了缓存替换,标记了新的缓存放在哪个位置。 } \questionandanswer[5.11.5]{ [ 5 ]<5.4>绘制块大小为2字、总容量为8字的全相联cache 的组织结构图。图中应有类似于图5-18的样式,还应该清楚地显示标签和数据字段的宽度。 }{ \includexopp[1.1]{5.11.5.1} 块大小为2字,所以偏移量为1位,一个字是32位,所以数据大小为64位。总容量为8字,所以有4个块,全相联所以4个块排成一行,没有索引位,所以标签为$64-1=63$位。 } \questionandanswer[5.11.6]{ [ 10 ]<5.4>从5.11.5中记录cache 的行为。假设cache使用LRU替换策略。对于每一次 cache访问,确定: \begin{itemize} \item 二进制字地址。 \item 标签。 \item 索引。 \item 偏移。 \item 访问会命中还是失效。 \item 在处理访问后,cache每一路中有哪些标签。 \end{itemize} }{ \includexopp[1.1]{5.11.6.1} 图中Tag列中的蓝色线表示4位分隔,便于二进制转十六进制。Hit(命中)列用蓝色圈表示命中,在命中时右侧的蓝色下划线表示命中了哪一路的标签,同时也代表产生了一次访问(相当于LRU把它放到链表最后)。在未命中时右侧的红色下划线表示替换了哪一路的标签,同时也代表产生了一次访问。 所以,对于每一行,填写方法是:先把Tag转成十六进制,再查看Way(这里全相联就是四路组相联,Way表示路)中是否有这个十六进制地址,如果有,表示命中,那就把上一行的Way复制下来,并在命中的地址上划一条蓝色下划线;如果没有,表示未命中,就从这行开始向上查看最近的哪条下划线距离最远(表示最久没访问),那么就替换这个地址,其他地址不变,替换后在这个地址上划一条红色下划线。 } \end{enumerate} \questionandanswer[5.12]{ 多级cache是一种重要的技术,可以在克服一级cache提供的有限空间的同时仍然保持速度。考虑具有以下参数的处理器: \begin{center} \small \begin{tabularx}{\linewidth}{ZZZZZZZZ} \toprule 无内存停顿的基本CPI & 处理器速度 & 主存访问时间 & 每条指令的 L1 cache 的失效率 * & L2 直接映射 cache 速度 & L2 直接映射 cache 全局失效率 & L2八路组相联速度 & L2八路组相联cache全局失效率 \\ \midrule 1.5 & 2GHz & 100ns & 7\% & 12cycles & 3.5\% & 28cycles & 1.5\% \\ \bottomrule \end{tabularx} *Ll cache失效率是针对每条指令而言的。假设Ll cache的总失效数量(包括指令和数据)为总指令数的7\%。 \end{center} }{ \textcolor{red}{\Large 这题的参考答案有误,答案当成局部失效率计算了。(全局失效率与局部失效率的定义在课本第290页)} } \begin{enumerate} \questionandanswer[5.12.1]{ [ 10 ]<5.4>使用以下方法计算表中处理器的CPI:仅有Ll cache;使用L2直接映射cache;使用L2八路组相联cache。如果主存访问时间加倍,这些数据会如何变化?(将每个更改作为绝对CPI和百分比更改。)请注意L2 cache可以隐藏慢速内存影响的程度。 }{ 先计算主存访问的时钟周期,$2 \times 10^{9} \text{Hz} \times 100 \times 10^{-9} \text{s} = 200 \text{cycles}$。 全局失效率是指访问L2并且L2失效的指令数量与全部指令数量的比值;局部失效率是指访问L2并且L2失效的指令数量与访问L2的指令的数量的比值。 \begin{itemize} \item 仅有L1 cache时,CPI为$1.5+7\% \times 200 = \bm{15.5}$周期; \item 使用L2直接映射cache时,CPI为 $1.5+7\% \times 12 + 3.5\% \times 200 = \bm{9.34}$周期; \item 使用L2八路组相联cache时,CPI为 $1.5+7\% \times 28 + 1.5\% \times 200 = \bm{6.46}$周期。 \end{itemize} 如果主存访问时间加倍, \begin{itemize} \item 仅有L1 cache时,CPI为$1.5+7\% \times 400 = \bm{29.5}$周期,增加了$29.5-15.5=\bm{14}$个周期,增加了$14 / 15.5 = \bm{90.3225806451613\%}$; \item 使用L2直接映射cache时,CPI为 $1.5+7\% \times 12 + 3.5\% \times 400 = \bm{16.34}$周期,增加了$16.34-9.34 = \bm{7}$个周期,增加了$7 / 15.5 = \bm{45.1612903225806\%}$; \item 使用L2八路组相联cache时,CPI为 $1.5+7\% \times 28 + 1.5\% \times 400 = \bm{9.46}$周期,增加了$9.46-6.46 = \bm{3}$个周期,增加了$3 / 6.46 = \bm{46.4396284829721}\%$。 \end{itemize} } \questionandanswer[5.12.2]{ [ 10 ]<5.4>可能有比两级更多的cache层次结构吗?已知上述处理器具有L2直接映射cache,设计人员希望添加一个L3 cache,访问时间为50个时钟周期,并且该cache将具有13\%的失效率。这会提供更好的性能吗?一般来说,添加L3 cache有哪些优缺点? }{ 可能有比两级更多的cache层次结构。这里的13\%失效率没有说局部还全局。那么,如果它是全局失效率,那么肯定要比L2的全局失效率低,但是这里它比L2的全局失效率高,所以只能是局部失效率。 那么加入L3 cache后的CPI为:$1.5+7\%\times 12 +3.5\% \times (50 + 13\% \times 200) = 5$周期 $<$ 9.34 周期,所以\boldkai{会}提供更好的性能。 添加L3 cache的优点是能用更小的全局失效率兜底,隐藏慢速内存影响的程度,减小总体的CPI;缺点是一旦全部缓存都失效,必须访问主存时,会产生很大的延迟。 } \questionandanswer[5.12.3]{ [ 20 ]<5.4>在较老的处理器中,例如Intel Pentium或Alpha 21264,L2 cache在主处理器和Ll cache的外部(位于不同芯片上)。虽然这种做法使得大型L2 cache成为可能,但是访问cache 的延迟也变得很高,并且因为L2 cache以较低的频率运行,所以带宽通常也很低。假设512KiB的片外L2 cache 的失效率为4\%,·如果每增加一个额外的512KiB cache能够降低0.7\%的失效率,并且cache 的总访问时间为50个时钟周期,那么cache容量必须多大才能与上面列出的L2直接映射cache的性能相匹配? }{ 这里$4\%$的失效率应该为局部失效率。设有$x+1$个512 KiB 的片外L2 cache。那么 $$ 1.5+7\%\times 12+3.5\%\times 200 = 1.5 + 7\% \times (50+(4\% - 0.7\% x)\times 200) $$ 解得 $x = - \frac{270}{7} = -38.5714285714286$,但$x$应$\geqslant 0$,所以\boldkai{不存在合适的cache容量与上面列出的L2直接映射cache的性能相匹配。} } \end{enumerate} \questionandanswer[5.16]{ 如5.7节所述,虚拟内存使用页表来跟踪虚拟地址到物理地址的映射。本题显示了在访问地址时必须如何更新页表。以下数据构成了在系统上看到的虚拟字节地址流。假设有4KiB页,一个4表项全相联的TLB,使用严格的LRU替换策略。如果必须从磁盘中取回页,请增加下一次能取的最大页码: \begin{center} \begin{tabular}{cccccccc} \toprule 十进制 & 4669 & 2227 & 13916 & 34587 & 48870 & 12608 & 49225 \\ \midrule 十六进制 & 0x123d & 0x08b3 & 0x365c & 0x871b & 0xbee6 & 0x3140 & 0xc049 \\ \bottomrule \end{tabular} \end{center} TLB \begin{center} \begin{tabular}{cccc} \toprule 有效位 & 标签 & 物理页号 & 上次访问时间间隔 \\ \midrule 1 & 0xb & 12 & 4 \\ 1 & 0x7 & 4 & 1 \\ 1 & 0x3 & 6 & 3 \\ 0 & 0x4 & 9 & 7 \\ \bottomrule \end{tabular} \end{center} 页表 \begin{center} \begin{tabular}{ccc} \toprule 索引 & 有效位 & 物理页号/在磁盘中 \\ \midrule 0 & 1 & 5 \\ 1 & 0 & 在磁盘中 \\ 2 & 0 & 在磁盘中 \\ 3 & 1 & 6 \\ 4 & 1 & 9 \\ 5 & 1 & 11 \\ 6 & 0 & 在磁盘中 \\ 7 & 1 & 4 \\ 8 & 0 & 在磁盘中 \\ 9 & 0 & 在磁盘中 \\ a & 1 & 3 \\ b & 1 & 12 \\ \bottomrule \end{tabular} \end{center} }{} \begin{enumerate} \questionandanswer[5.16.1]{ [ 10 ]<5.7>对于上述每一次访问,列出: \begin{itemize} \item 本次访问在 TLB会命中还是失效。 \item 本次访问在页表中会命中还是失效。 \item 本次访问是否会造成缺页错误。 \item TLB的更新状态。 \end{itemize} }{ 4KiB即$2^{12}$Bytes,所以对于一个十六进制地址,右侧三位十六进制表示页内偏移,左侧一位表示标签。 \includexopp[1.5]{5.16.1.1} \begin{itemize} \item TLB是否失效,只需要查看是否在上一行的Tag中出现过; \item 页表是否失效,只需要看标签是否在页表中出现; \item 如果某个标签在磁盘中,或者不在页表中,都会造成缺页错误; \item 每次访问后,TLB中的上次访问时间间隔都需要加一(用蓝色表示),如果TLB未命中,则需要替换上次访问时间间隔最大的那一行(用红色表示),不管是否命中都需要把当前访问到的Tag所在的那行的上次访问时间间隔改为0(用红色表示); \item 题目中的“如果必须从磁盘中取回页,请增加下一次能取的最大页码”的意思是发生缺页错误时,分配的物理页号是当前最大的物理页号加一。 \item 答案中的last access是相对顺序,每次替换序号最小的一行,而这里是指访问时间间隔,所以每次替换最大的一行。 \end{itemize} } \questionandanswer[5.16.2]{ [ 15 ]<5.7>重复5.16.1,但这次使用16KiB页而不是4KiB页。拥有更大页大小的优势是什么?有什么缺点? }{ 16KiB = $2^{14}$Bytes,所以右侧14位二进制位表示页内偏移,左侧2位二进制位表示页号。 \includexopp[1.5]{5.16.2.1} 由于标签只有2位,所以一共4行的TLB不会出现很多次置换,这里的上次访问间隔就省略了(直接按照原始的TLB,先置换第4行,再置换第1行,再置换第3行,再置换第2行),每次置换的行仍然用红色表示。 拥有更大页大小的优势是有更高的快表命中率,缺点是会降低内存使用率(产生了更多内零头)。 } \questionandanswer[5.16.3]{ [ 15 ]<5.7>重复5.16.1,但这次使用4KiB页和一个两路组相联TLB。 }{ 一个页是4KiB,两个页组成一行。右侧12位表示页内偏移,中间1位表示索引,左侧3位表示标签。页号仍然是左侧4位。 \includexopp[1.1]{5.16.3.1} } \questionandanswer[5.16.4]{ [ 15 ]<5.7>重复5.16.1,但这次使用4KiB页和一个直接映射 TLB。 }{ 一个页是4KiB,右侧12位表示页内偏移,中间2位表示索引,左侧2位表示标签。页号仍然是左侧4位。 \includexopp[1.5]{5.16.4.1} } \questionandanswer[5.16.5]{ [ 10 ]<5.4,5.7>讨论为什么CPU必须使用TLB才能实现高性能。如果没有TLB,如何处理虚拟内存访问? }{ 为了便于编写程序,写代码时不需要指定某段数据放在哪个物理地址中,出现了虚拟地址,为了将虚拟地址存放到实际的物理地址中,需要有个表存放这个映射关系,这就是页表,而页表存放在内存中,访问比较慢。但是每次访问虚拟地址时,都需要访问一次页表再访问实际的数据,也就是访问两次内存,所以就出现了TLB(快表)作为页表的缓存,在TLB命中时只需要访问一次内存,从而提升性能。 如果没有TLB,每次虚拟内存访问就需要访问两次内存,第一次访问页表,第二次再访问实际的数据。 } \end{enumerate} \end{enumerate} \end{document}