\documentclass[全部作业]{subfiles}
\input{mysubpreamble}
\begin{document}
\chapter{计算机抽象及相关技术}
\begin{enumerate}
    \questionandanswer[1.3]{
        [ 2 ]<1.3>请描述高级语言(例如C)编写的程序转化为能够直接在计算机处理器上执行的表示的具体步骤。
    }{
        高级语言通过编译器（编译型的高级语言，如C、C++）或解释器（解释型的高级语言，如Python、JavaScript）转化成指令，再转化成二进制的机器码，或者直接转化成二进制的机器码（不同的硬件对应的机器码可能不同），机器码就是能够直接在计算机处理器上执行的表示。
    }
    \questionandanswer[1.5]{
        [ 4 ]<1.6>有3种不同的处理器P1、P2和P3执行同样的指令系统。P1的时钟频率为3GHz,CPI为1.5;P2的时钟频率为2.5GHz，CPI为1.0;P3的时钟频率为4GHz,CPI为2.2。
    }{}
    \begin{enumerate}
        \questionandanswer[-]{
            \item 以每秒执行的指令数为标准,哪个处理器性能最高?
        }{
            \noindent
            P1：$\frac{3 \text{GHz}}{1.5\text{时钟周期数/指令}}=2\times 10^{9}$\\
            P2：$\frac{2.5\text{GHz}}{1.0\text{时钟周期数/指令}}=2.5\times 10^{9}$\\
            P3：$\frac{4\text{GHz}}{2.2\text{时钟周期数/指令}}\approx 1.818\times 10^{9}$\\
            所以处理器P2性能最高。
        }
        \questionandanswer[-]{
            \item 如果每个处理器执行一个程序都花费10秒时间，求它们的时钟周期数和指令数。
        }{
            \begin{tabular}{ccc}
            \toprule
               & 时钟周期数 & 指令数 \\
            \midrule
             P1 & $3\text{GHz}\times 10s=30\times 10^{9}$ & $\frac{30\times 10^{9}}{1.5}=20\times 10^{9}$ \\
             P2 & $2.5\text{GHz}\times 10s=25\times 10^{9}$ & $\frac{25\times 10^{9}}{1.0}=25\times 10^{9}$ \\
             P3 & $4\text{GHz}\times 10s=40\times 10^{9}$ & $\frac{40\times 10^{9}}{2.2}\approx 18.1818\times 10^{9}$ \\
            \bottomrule
            \end{tabular}
        }
        \questionandanswer[-]{
            \item 我们试图把执行时间减少30\%，但这会引起CPI增大20\%。请问为达到时间减少30\%的目标，时钟频率应达到多少?
        }{
            $$
            \text{执行时间}\times 70\% = \text{指令数}\times (\text{CPI}\times 120\%) / \text{时钟频率}
            $$
            $$
            \text{时钟频率}=\frac{\text{指令数}\times \text{CPI}}{\text{执行时间}}\times \frac{1.2}{0.7} \approx 1.714 \times \text{原始时钟频率}
            $$
            所以时钟频率要达到原始时钟频率的大约$1.714$倍。
        }
    \end{enumerate}
    \questionandanswer[1.6]{
        [ 20 ]<1.6>同一个指令系统体系结构有两种不同的实现方式。根据CPI的不同将指令分成四类(A、B、C和D)。P1的时钟频率为2.5GHz，CPI分别为1、2、3和3;P2时钟频率为3GHz，CPI分别为2、2、2和2。\\
        给定一个程序，有$1.0\times 10^{6}$条动态指令，按如下比例分为4类:A，10\%;B，20\%;C，50\%;D，20\%。
    }{}
    \begin{enumerate}
        \questionandanswer[-]{
            \item 每种实现方式下的整体CPI是多少?
        }{
            P1：$1\times 10\%+2\times 20\%+3\times 50\%+3\times 20\% = 2.6$\\
            P2：$2$
        }
        \questionandanswer[-]{
            \item 计算两种情况下的时钟周期总数。
        }{
            P1：$1.0\times 10^{6}\times 2.6 = 2.6\times 10^{6}$\\
            P2：$1.0\times 10^{6}\times 2=2\times 10^{6}$
        }
    \end{enumerate}
    \questionandanswer[1.7]{
        [ 15 ]<1.6>编译器对应用程序性能有极深的影响。假定对于一
        个程序,如果采用编译器A，则
        动态指令数为$1.0\times 10^{9}$，执行时间为1.1s;如果采用编译器B，则动态指令数为$1.2\times 10^{9}$，执行时间为1.5s。
    }{}
    \begin{enumerate}
        \questionandanswer[-]{
            \item 在给定处理器时钟周期长度为1ns时，求每个程序的平均CPI。
        }{
            编译器A：$\frac{1.1s}{1\times 10^{-9} s}/1.0\times 10^{9}=1.1$\\
            编译器B：$\frac{1.5s}{1\times 10^{-9} s}/1.2\times 10^{9}=1.25$
        }
        \questionandanswer[-]{
            \item 假定被编译的程序分别在两个不同的处理器上运行。如果这两个处理器的执行时间相同，求运行编译器A生成之代码的处理器时钟比运行编译器B生成之代码的处理器时钟快多少。
        }{
            % 相同处理器时执行时间分别为1.1s和1.5s，那么相同执行时间时处理器时钟的比值为：
            $$
            \begin{aligned}
                % &\frac{处理器1时钟}{处理器2时钟}=\frac{处理器1时钟\times 执行时间}{处理器2时钟\times 执行时间}=\frac{编译器A生成代码的时钟周期数}{编译器B生成代码的时钟周期数} \\
                执行时间_{A}&=执行时间_{B} \\
                \frac{指令数_{A}\times CPI_{A}}{时钟频率_{A}}&=\frac{指令数_{B}\times CPI_{B}}{时钟频率_{B}} \\
                \frac{时钟频率_{A}}{时钟频率_{B}}&=\frac{指令数_{A}\times CPI_{A}}{指令数_{B}\times CPI_{B}}=\frac{1.0\times 10^{9}\times 1.1}{1.2\times 10^{9}\times 1.25} = \frac{11}{15} = 0.733 \\
            \end{aligned}
            $$
            % $$
            % \frac{1.5s}{1.2s} = 1.25
            % $$
            所以题意应该是错了，运行编译器A生成之代码的处理器时钟比运行编译器B生成之代码的处理器时钟慢，约$0.733$倍。
        }
        \questionandanswer[-]{
            \item 假设开发了一种新的编译器，只需$6.0\times 10^{8}$条指令，程序平均CPI为1.1。求这种新的编译器在原处理器环境下相对于原编译器A和B的加速比。
        }{
            记这个新的编译器为C。
            $$
            \frac{性能C}{性能A}=\frac{执行时间A}{执行时间C}=\frac{\frac{指令数_{A}\times CPI_{A}}{时钟频率}}{\frac{指令数_{C}\times CPI_{C}}{时钟频率}}=\frac{指令数_{A}\times CPI_{A}}{指令数_{C}\times CPI_{C}}=\frac{1.0\times 10^{9}\times 1.1}{6.0\times 10^{8}\times 1.1} = \frac{5}{3} \approx  1.667
            $$
            同理，
            $$
            \frac{性能C}{性能B}=\frac{指令数_{B}\times CPI_{B}}{指令数_{C}\times CPI_{C}}=\frac{1.2\times 10^{9}\times 1.25}{6.0\times 10^{8}\times 1.1} = \frac{25}{11} \approx  2.273
            $$
            所以这种新的编译器在原处理器环境下相对于原编译器A和B的加速比分别约为$1.667$和$2.273$。
        }
    \end{enumerate}
    \questionandanswer[1.9]{
        在某处理器中，假定算术指令、load/store指令和分支指令的CPI分别是1、12和5。同时假定某程序在单个处理器核上运行时需要执行$2.56\times 10^{9}$条算术指令、$1.28\times 10^{9}$条load/store指令和$2.56\times 10^{8}$条分支指令，并假定处理器的时钟频率为2GHz。
        现假定程序并行运行在多核上，分配到每个处理器核上运行的算术指令和 load/store指令数目为单核情况下相应指令数目除以$0.7\times p$ ( $p$为处理器核数)，而每个处理器的分支指令的数量保持不变。
    }{}
    \questionandanswer[1.9.1]{
        [ 5 ]<1.7>求出当该程序分别运行在1、2、4和8个处理器核上的执行时间，并求出其他情况下相对于单核处理器的加速比。
    }{
        $$
        多核执行时间=\frac{指令数\times CPI}{时钟周期}=\frac{\frac{2.56\times 10^{9}}{0.7\times p}\times 1+\frac{1.28\times 10^{9}}{0.7\times p}\times 12+2.56\times 10^{8}\times 5}{2\times 10^{9}} = \frac{16 (p + 20)}{25 p} s
        $$
        $$
        单核执行时间=\frac{指令数\times CPI}{时钟周期}=\frac{2.56\times 10^{9}\times 1+1.28\times 10^{9}\times 12+2.56\times 10^{8}\times 5}{2\times 10^{9}} = \frac{48}{5} = 9.6 s
        $$
        $$
        多核与单核的加速比=\frac{单核执行时间}{多核执行时间}=\frac{\frac{48}{5}}{\frac{16(p+20)}{25p}} = \frac{15 p}{p + 20}
        $$
        \begin{center}
            \begin{tabular}{ccc}
                \toprule
                处理器核数 & 执行时间 & 加速比 \\
                \midrule
                1 & 9.600 & 1.000 \\
                2 & 7.040 & 1.364 \\
                4 & 3.840 & 2.500 \\
                8 & 2.240 & 4.286 \\
                \bottomrule
            \end{tabular}
        \end{center}
    }
    \questionandanswer[1.9.2]{
        [ 10 ]<1.6,1.8>如果算术指令的CPI加倍，对分别运行在1、2、4和8个处理器核上的执行时间有何影响?
    }{
        $$
        多核执行时间=\frac{\frac{2.56\times 10^{9}}{0.7\times p}\times 2+\frac{1.28\times 10^{9}}{0.7\times p}\times 12+2.56\times 10^{8}\times 5}{2\times 10^{9}} = \frac{16 (7 p + 160)}{175 p} s
        $$
        $$
        单核执行时间=\frac{2.56\times 10^{9}\times 2+1.28\times 10^{9}\times 12+2.56\times 10^{8}\times 5}{2\times 10^{9}} = \frac{272}{25} = 10.88 s
        $$
        \begin{center}
            \begin{tabular}{ccc}
                \toprule
                处理器核数 & 之前的执行时间 & 现在的执行时间 \\
                \midrule
                1 & 9.600 & 10.880 \\
                2 & 7.040 & 7.954 \\
                4 & 3.840 & 4.297 \\
                8 & 2.240 & 2.469 \\
                \bottomrule
            \end{tabular}
        \end{center}
    }
    \questionandanswer[1.9.3]{
        [ 10 ]<1.6,1.8>如果要使单核处理器的性能与四核处理器相当，单处理器中 load/store指令的CPI应该降低多少?此处假定四核处理器的CPI保持原数值不变。
    }{
        设单处理器中 load/store指令的CPI应该降低到原CPI的$x$倍。
        $$
        \begin{aligned}
        单核处理器（CPI降低）的执行时间&=四核处理器（原CPI）的执行时间 \\
        \frac{2.56\times 10^{9}\times 1+1.28\times 10^{9}\times 12x+2.56\times 10^{8}\times 5}{2\times 10^{9}} &= \frac{16 \times (4 + 20)}{25 \times 4} \\
        \frac{192 x}{25} + \frac{48}{25}  &= \frac{96}{25} \\
        \end{aligned}
        $$
        $$
        x = \frac{96-48}{192} = \frac{1}{4} = 0.25
        $$
        所以单处理器中 load/store指令的CPI应该降低到原CPI的0.25倍，即$12\times 0.25=3$。
    }
\end{enumerate}
\end{document}