\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}