我正在尝试了解如何计算一组操作对特定 CPU 和 I/O 设备花费的 CPU 周期数



这是一道考试题(练习考试,而不是真正的考试),但我不知道如何得出答案:

该计算机有一个速度为2GHz的64位CPU,指令对连接到33MHz总线(32位宽)的设备执行编程输入/输出。设备寄存器的内存映射范围为e000到e0ff。

(MOVQ$A,R执行从地址A到寄存器R的64位复制。)

这些指令大概需要多少个CPU周期才能执行?

  • MOVQ$0x000,r1
  • MOVQ$0x000,r2
  • MOVQ$0xe000,r3
  • MOVQ$0x000,r4
  • MOVQ$0x008,r5

这是一个多选答案,以下是可能的选项:

  • a。大约120个CPU周期
  • b。大约240个CPU周期
  • c。大约600个CPU周期
  • d。大约1200个CPU周期
  • e。大约9600个CPU周期

所以,虽然我在寻找答案,但我也在寻找正确答案背后的推理,这样,如果在真正的考试中有类似的问题,我就可以通过自己计算来正确回答。

我在课本和网上都找不到任何东西来帮助我计算这个。

我想我们只能给你一个最天真的答案。

让我们做一些假设。

  • 指令被缓存或在高速内存中,获取需要0个CPU周期
  • 通过32位总线访问64位数据需要2个总线周期

因此,访问5个内存位置需要10个总线周期。

主CPU时钟频率为2000 MHz,总线时钟频率为33 MHz;这是一个约60:1的比例。

答案是大约600个CPU周期。

由于寄存器是64位的,因此需要传输64位。总线是32位宽的,所以这意味着2次传输。在33MHz总线速度下,为2/33MHz~60.6ns。由于cpu为2GHz,每个周期为1/2GHz=0.5ns。因此周期数为60.6ns/0.5ns~120。这是每一条说明。如果这个问题的意思是总数,那么它当然是5*120=600。

每次读取:

  • CPU解码指令,计算出它想要什么,并最终发送一个";读取请求";在公共汽车或链路上。让我们假设这需要花费1个CPU周期。

  • CPU使用的总线或链路可能不是设备使用的33MHz总线(因为2GHz CPU和33MHz RAM是不合理的)。通常有一条快速本地总线(或一组快速链路)连接CPU/s、RAM和其他东西(路由器、网桥);然后在其他东西的另一边的较慢的总线。假设它需要2〃;快速总线循环";对于CPU的";读取请求";以便从快速总线转发到设备的33MHz总线;让我们也假设;2个快速总线周期";相当于4个CPU周期。

  • 当";读取请求";将其连接到设备的33 MHz总线;该总线是32位的,但是读取请求本身将由多个字段组成——例如;过渡类型";字段和一个";32位地址";字段(以及用于同步的"开始/结束",以及用于错误检测的CRC等等);读取请求";以到达设备。

  • 在设备接收到";读取请求";它需要解码并弄清楚该怎么做。这可能需要更多的总线周期(但这实际上取决于设备本身),但我们假设它需要2个周期。

  • 最终该设备将发送回一个";阅读回复";。这可能是一个较大的数据包(例如,"事务类型"字段,"32位地址"字段,然后"64位数据"拆分为两个32位字段)。假设这需要4个总线周期才能返回到"网络"上的路由器/桥接器;快速总线";。

  • 在";"快速总线";,也许我们可以预期对于"0"的等效6个CPU周期;读取回复";以使其返回到CPU。

  • 一旦";读取回复";回到CPU时,CPU可能会多花1个周期来完成指令。

如果你把所有这些加起来,它就变成了";1+4+4+1=10〃;CPU周期加上";2+2+4=8〃;公共汽车周期。现在我们需要将总线周期转换为CPU周期——";2GHz/33MHz=60.606〃;所以我们可以说,1个总线周期相当于61个CPU周期(四舍五入,因为你不可能真正拥有CPU周期的一小部分);8个总线周期相当于488个CPU周期。

现在我们可以把它插进去,说它可能需要";10+488=498〃;完成一次读取的CPU周期。有5次读取,所以它可能需要5倍的时间,所以可能需要2440个CPU周期。

现在。。。我们编造了一堆缺失的信息;2440个CPU周期";不是一种选择。在这种情况下,自然要做的是猜测为什么这个问题是无稽之谈。缺失的信息意味着问题忽略了各种重要的事情,因此可以合理地假设,问题认为正确的错误答案将少于问题错误的任何正确答案(也少于我们通过填写缺失的信息获得的答案)。这一假设使我们得出";d. Approximately 1200 CPU cycles";。

有了假定的答案,我们就可以倒推了。如果假设的答案是1200个周期,并且有5条指令,那么每条指令将有240个CPU周期。如果1个总线周期相当于61个CPU周期;则240个CPU周期将大致等于4个总线周期(忽略在CPU解码指令等所花费的时间,这可能是可忽略的)。现在我们可以假装;读取请求";有一个32位的地址,没有其他的(没有事务类型);读取回复";有一个32位地址和一个64位值,没有其他内容(没有事务类型)。当然这纯属无稽之谈(没有路由器/网桥意味着RAM是33 MHz或不存在;没有事务类型意味着没有明显的方法来确定总线上的任何东西是请求或回复、读取或写入,还是任何其他类型的事务,例如IRQ或错误代码或一致性通信或..;没有时间让设备确定该做什么意味着设备已经找到了电子设备打破光)。

最新更新