管道中有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 |
考虑使用"操作数转发"。
解决方案说: -
指令
I1
是Load
指令。因此,直到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一次一次解码了多个指令,从而减轻了摊位的问题(但不会消除它)。
正是缓存为避免失速提供了最大的好处。