计组习题的那些事(1)

今天起床,感觉十分通透啊,是个不错的日子!!!

问题:

按照图1-2中部件之间的数据传输及控制命令,列出执行机器指令 Load R2, LOC 所需的步骤。假设包含指令的存储单元的地址最初保存在寄存器 PC 中。


答案:

  1. 将指令字地址发送到存储器
    • 将寄存器 PC 的内容(即当前指令的地址)传送到存储器地址总线,并发出读控制命令以读取该指令。
  2. 取回指令字并加载到寄存器 IR
    • 等待存储器返回所请求的指令字,并将其加载到指令寄存器 IR 中。
    • IR 中,控制电路对指令进行解释(或译码),以确定需要执行的操作。
  3. 递增 PC 寄存器
    • 更新寄存器 PC 的内容,使其指向存储器中的下一条指令。
  4. 读取操作数地址 LOC
    • 从指令寄存器 IR 中提取地址字段 LOC,将其发送到存储器地址总线,并发出读控制命令。
  5. 将数据加载到 R2
    • 等待存储器返回地址 LOC 所指向的数据,将该数据加载到寄存器 R2 中。

问题:

根据描述,分别列出以下机器指令的执行步骤:

  1. Add R4, R2, R3
  2. Store R4, LOC

答案:

1. Add R4, R2, R3 的执行步骤

  1. 获取指令:
    • 将寄存器 PC 中的地址发送到存储器,并发出读取控制命令。
  2. 加载并译码指令:
    • 等待存储器返回指令字,将其加载到指令寄存器 IR 中,由控制电路解析指令以确定操作(即加法)。
  3. 更新 PC:
    • 递增 PC 的内容以指向下一条指令。
  4. 加载操作数并执行加法:
    • 将寄存器 R2R3 的内容传送到算术逻辑单元(ALU),并发出加法命令。
  5. 存储结果:
    • 将 ALU 的输出结果发送到寄存器 R4 中。

2. Store R4, LOC 的执行步骤

  1. 获取指令:
    • 将寄存器 PC 中的地址发送到存储器,并发出读取控制命令。
  2. 加载并译码指令:
    • 等待存储器返回指令字,将其加载到寄存器 IR 中,由控制电路解析指令以确定操作(即存储操作)。
  3. 更新 PC:
    • 递增 PC 的内容以指向下一条指令。
  4. 准备地址与数据:
    • IR 中提取地址值 LOC,并将其与寄存器 R4 的内容一起发送到存储器。
  5. 写入数据:
    • 发出写控制命令,将 R4 的内容存储到地址 LOC 指定的位置。

解释:

1. Add R4, R2, R3

这是一个算术指令,用于将两个寄存器 (R2R3) 的值相加,并将结果存储到目标寄存器 R4 中。执行过程包括获取指令、解析操作、加载操作数、ALU 计算以及存储结果。

2. Store R4, LOC

这是一个存储指令,用于将寄存器 R4 的内容写入到存储器指定的地址 LOC。执行过程包括指令获取与解析、地址计算、数据传输和存储器写操作。

两个指令分别代表了处理器内部操作与存储器交互的不同方面,展示了典型的指令执行流程。

两种实现

  • Load R2, A
  • Load R3, B
  • Add R4, R2, R3
  • Store R4, C
    描述其执行过程。

如果用更少的指令完成相同操作,另一组指令是:

  • Move C, B
  • Add C, A

缓存问题:

这里其实是在为第八章进行服务,决定从头看这本计组书,既然说了要通透,那又怎么能够食言呢?

  1. 在没有和有高速缓存的情况下,计算程序执行时间并求加速比。
  2. 用变量替换常数,写出加速比的表达式。
  3. 如果指定变量取值,求满足给定加速比的循环迭代次数。
  4. 当循环迭代次数趋于无穷时,加速比的上限是多少?

答案:

(a) 没有高速缓存和有高速缓存的执行时间及加速比

  1. 没有高速缓存的时间 $ T $:
    • 总共 300 条指令,其中循环外有 $ 300 - 50 = 250 $ 条。
    • 每条指令需要 20 个时间单位:
      $ T = 250 + 50 = 5000 + 15000 = 20000 $
  2. 有高速缓存的时间 $ T_{} $:
    • 程序第一次执行所有 300 条指令(高速缓存为空,需要从主存取指令)。
    • 循环需要执行 15 次,其中第 1 次需要从主存取指令,后续 14 次从高速缓存中取指令:
      $ T_{} = 300 + 50 = 6000 + 1400 = 7400 $
  3. **加速比 $ S \(**:\) S = = $

(b) 用变量替换常数,写出加速比表达式

令:

  • $ w $: 程序总指令数(300)
  • $ x $: 循环中的指令数(50)
  • $ y $: 循环的迭代次数(15)
  • $ m $: 无高速缓存时每条指令的时间(20)
  • $ c $: 高速缓存命中时每条指令的时间(2)

没有高速缓存的总时间为:
$ T = (w - x) m + x m y $

有高速缓存的总时间为:
$ T_{} = w m + x c (y - 1) $

加速比 $ S $ 为:
$ S = $

化简为:
$ S = $


(c) 设 $ w = 300, x = 50, m = 20, c = 2 $,求 $ y $ 满足 $ S = 5 $

加速比公式为:
$ 5 = $

整理后:
$ 5 = 300 + 50 (y - 1) $

展开:
$ 30000 + 500 (y - 1) = 60000 + 100 (y - 1) $

化简后:
$ 400 (y - 1) = 30000 $

解得:
$ y = 49 $


(d) 当 $ y $ 时,加速比的上限

从加速比公式:
$ S = $

当 $ y $ 时,分子和分母中 $ x (y - 1) $ 项占主导,化简为:
$ S = $

因此,加速比的上限为:
$ S_{} = = = 10 $


总结:

  1. 没有高速缓存和有高速缓存的加速比分别为 $ 2.7 $。
  2. 一般加速比公式为:
    $ S = $
  3. 当 $ y = 49 $ 时,加速比为 5。
  4. 加速比的上限为 $ = 10 $。

问题:

  1. 假设从高速缓存和主存中取指令的时间分别为 1 和 10 时间单位,并且所请求指令在高速缓存中找到的概率为 0.96,计算没有高速缓存与有高速缓存情况下的加速比。
  2. 如果高速缓存大小加倍,并假设未命中概率减半(即为 0.02),计算新的加速比。

答案:

(a) 高速缓存未加倍时的加速比

  1. 没有高速缓存的情况下:
    • 每条指令都需要从主存中取,取指令时间为 10 时间单位。
  2. 有高速缓存的情况下:
    • 高速缓存命中概率为 $ P_{} = 0.96 $,未命中概率为 $ P_{} = 0.04 $。
    • 未命中的情况下,从主存取指令需要 10 个时间单位,然后从缓存取出需要 1 个时间单位,总计 $ 10 + 1 = 11 $ 个时间单位。
    • 平均取指时间:
      $ T_{} = P_{} + P_{} $ 代入值:
      $ T_{} = 0.96 + 0.04 = 0.96 + 0.44 = 1.4 $
  3. **加速比 $ S \(**:\) S = = $

(b) 高速缓存大小加倍时的加速比

  1. 新的高速缓存性能参数:

    • 高速缓存未命中概率减半,即 $ P_{} = 0.02 $。
    • 命中概率 $ P_{} = 0.98 $。
  2. 新的平均取指时间:
    $ T_{} = P_{} + P_{} $ 代入值:
    $ T_{} = 0.98 + 0.02 = 0.98 + 0.22 = 1.2 $

  3. **新的加速比 $ S \(**:\) S = = $


解释:

  1. 高速缓存的作用:
    • 高速缓存通过减少从主存取指令的次数显著降低了平均取指时间。
    • 命中概率越高,平均取指时间越接近于 1。
  2. 加倍高速缓存的效果:
    • 缓存命中概率从 0.96 提高到 0.98,未命中概率降低一半,使得平均取指时间从 1.4 降到 1.2。
    • 加速比因此从 7.1 增加到 8.3。
  3. 结论:
    • 高速缓存的大小和命中率直接影响加速比。更大的高速缓存进一步提升性能,但收益会逐渐减小。

问题:

  1. 一个字节存储单元中包含模式 01010011,当解释为二进制数时,它所表示的十进制数是多少?如果解释为 ASCII 码,它表示什么?
  2. 描述如何检测两个补码数相减时的溢出。

答案:

1.9 解释字节模式为二进制数和 ASCII 码

  1. 作为二进制数:
    模式 01010011 的十进制值计算如下:
    $ 01010011 = 64 + 16 + 2 + 1 = 83 $ 因此,十进制值为 $ 83 $。

  2. 作为 ASCII 码:
    ASCII 码值 $ 83 $ 对应于字符 'S' (大写字母 S)。

总结:

  • 十进制数值:83
  • ASCII 表示:'S'

1.10 检测两个补码数相减时的溢出

  1. 假设操作为 $ R = A - B $。

    • 在补码运算中,减法可视为 $ A - B = A + (-B) $,其中 $ -B $ 是 $ B $ 的补码形式。
  2. 溢出条件:
    溢出发生在结果 $ R $ 超出补码能表示的范围(即符号位被错误改变)。

  3. 溢出检测规则:

    • 当 $ A $ 和 $ B $ 的符号不同时(一个是正数,一个是负数):
      • 如果 $ R $ 的符号与 $ A $ 的符号不同,则溢出。
      • 等价地,如果 $ R $ 的符号与 $ B $ 的符号相同,也表示溢出。
  4. 总结检测方法:

    • 条件 1: $ (A) (B) $
    • 条件 2: $ (R) (A) $ 或 $ (R) = (B) $。

解释:

  • 当符号位改变,结果超出了补码表示范围,就发生了溢出。例如,若正数减去负数结果超出最大正数范围,则溢出。
  • 通过检查符号位的变化,可以准确判断溢出是否发生。

这一章的习题并不难,当一个开胃小菜好了,后面的应该都是很重量级的。