加载后的指令如何执行



管道中有5个阶段。

IF -  Instruction fetch
ID -  Instruction Decode, read the register  
EX -  On a memeory reference add up base and offset, 
      and for arithmetic instruction do the math.   
MEM - If load or store access memory
WB -  Place the result in appropriate register.     

 I1 : R0 <- M[loc]      IF | ID | EX | MEM | WB |
 I2 - R0 <- R0 + R0                  | IF  | ID | EX | MEM | WB  | 
 I3 - R2 <- R2 - R0                        | IF | ID | EX  | MEM | WB |

考虑使用"操作数转发"。
解决方案说: -

指令I1Load指令。因此,直到I1完成其EXE阶段,下一个指令(I2)才能获取。

但我认为:在MEM阶段,处理器访问内存并选择所需的单词。在WB阶段中,它更新注册表。
因此,在MEM阶段之前,处理器保留了内存的控制,因此I2将在I1的CC_11之后开始获取。

哪一个是正确的?

尚未给出阶段的描述,它是根据我的知识编写的。

会议:

i 表示通用指令。
i1 i2 i3 ,...表示具体说明。 s 表示管道的通用阶段。
如果 id ex mem wb 表示该特定阶段管道。
i.s 表示指令 i 在阶段 s 。。

的循环

指令 i2 需要 r0 ,但是该寄存器不会从 i1 中准备就绪,直到 i1.wb 已经完成了基本管道。
i2 可以读取结果时, i1 将其写回寄存器文件,即 i1.wb 。<<em> i2 。/p>

由于操作数在 id 阶段读取, i2.ID i1.wb 必须同时进行。
这意味着必须在 i1.mem 的同一时间发生 i2.if


现在,您正确地怀疑了CPU在同一时钟中执行两次读取的能力(一个用于指令获取,一个用于负载)。
非常简单的CPU实际上停滞在这种冲突上(在您的示例中

避免失速的最简单方法是哈佛架构,CPU从其他内存中获取指令。

哈佛建筑已通过使用缓存和预先提取数据和说明进行了修改。
在这种情况下,只有当负载和指令获取需要访问内存(而不是缓存)时,就会发生失速。

现代台式机架构具有L1数据缓存,可以处理一个一次访问,并且CPU与它们紧密结合,因此可以同时执行两个或更多的负载/商店,并同时执行与L1的负载同时执行指令缓存。

最终,一些现代CPU一次一次解码了多个指令,从而减轻了摊位的问题(但不会消除它)。
正是缓存为避免失速提供了最大的好处。

相关内容

  • 没有找到相关文章

最新更新