首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MIPS管道转发(双重数据风险)

MIPS管道转发(双重数据风险)
EN

Stack Overflow用户
提问于 2011-11-17 10:25:32
回答 2查看 9.8K关注 0票数 9

在Patterson & Hennessy的书中:

但这不能作为一种危险来处理吗:

为什么在MEM阶段进行转发?又是如何做到的?有1个停顿(对于第二次添加,我将需要下一个EX的结果)?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-11-17 11:38:58

文档使用的http://www.cs.cornell.edu/courses/cs3410/2011sp/faq/faq_pa1.html

在考虑“双重数据危险”(原始规则)之前,我将重写EX和MEM危险条件(为简单起见,删除!=0部分):

外部危险

代码语言:javascript
复制
 if (EX/MEM.RegWrite and (EX/MEM.RegisterRd == ID/EX.RegisterRs)  # =EX_h_Rs 
   ) ForwardA = 10
 if (EX/MEM.RegWrite and (EX/MEM.RegisterRd == ID/EX.RegisterRt)  # =EX_h_Rt
   ) ForwardB = 10

我将调用条件EX_h_Rs和EX_h_Rt以使公式更简短

内存危险(原始条件)

代码语言:javascript
复制
 if (MEM/WB.RegWrite and (MEM/WB.RegisterRd == ID/EX.RegisterRs)) ForwardA = 01 
 if (MEM/WB.RegWrite and (MEM/WB.RegisterRd == ID/EX.RegisterRt)) ForwardB = 01

====

我们的示例同时具有两种类型的危险,在(1和3)和(2和3)之间:

代码语言:javascript
复制
add $1, $1, $2 
add $1, $1, $3 
add $1, $1, $4

或者(提示循环在顶部和底部用**标记)

代码语言:javascript
复制
                **   
add C+A -> A ... A
           v     ?  
     add B+A -> A
                v   
          add C+ A -> A     
                **     

根据我的链接,在考虑到双重EX +内存危险后:(没有!=0和重新排序的布尔项),更新了内存危险的规则

让我们修改内存风险的转发条件,以处理“双重”数据风险

代码语言:javascript
复制
 if (MEM/WB.RegWrite and (MEM/WB.RegisterRd = ID/EX.RegisterRs) and 
  not (EX/MEM.RegWrite and (EX/MEM.RegisterRd == ID/EX.RegisterRs)) 
  ) 
   ForwardA = 01
 if (MEM/WB.RegWrite and (MEM/WB.RegisterRd = ID/EX.RegisterRt) and 
  not (EX/MEM.RegWrite and (EX/MEM.RegisterRd == ID/EX.RegisterRt)) 
 ) 
   ForwardB = 01

或者使用EX_h_*的短记录也是如此

代码语言:javascript
复制
 if (MEM/WB.RegWrite and (MEM/WB.RegisterRd = ID/EX.RegisterRs) and 
  not ( EX_h_Rs ) 
  ) 
   ForwardA = 01
 if (MEM/WB.RegWrite and (MEM/WB.RegisterRd = ID/EX.RegisterRt) and 
  not ( EX_h_Rt ) 
 ) 
   ForwardB = 01

这意味着:

尝试从MEM/WB转发到EX;如果没有转发到来自EX/MEM流水线寄存器的相同输入操作数。

或者是相同的

甚至不要试图从MEM/WB转发到EX;如果已经从EX/MEM转发了更新的结果。

我将尝试举例说明:

代码语言:javascript
复制
add C+A -> A     A'
                 v?  (forwarding to 3rd instruction) 
           A -> A''
                v?
          add C+A -> A          

因此,对于第三条指令,原始规则会说来自第一条指令的A'和来自第二条指令的A''都应该被转发(但多路复用不能同时从两个源馈送)。修改内存管理危险条件表明,如果存在较新的A''的主动转发,则不应尝试转发A'

所以,你的画是对的,将会有2个EX hazard转发;但是如果已经有活动的EX Hazard转发,就不应该尝试MEM Hazard转发。

票数 7
EN

Stack Overflow用户

发布于 2012-01-09 07:23:00

这显然是该书第四版中的一个错误(例如,括号不对称)。奇怪的是,这本书的最新版本(第四版修订版)增加了一个遗漏的结尾')‘,但是……以错误的条件结束,仍然是

我认为这将是条件的正确版本:

代码语言:javascript
复制
if (MEM/WB.RegWrite
and (MEM/WB.RegisterRd ≠ 0)
and not(EX/MEM.RegWrite and (EX/MEM.RegisterRd ≠ 0)
       and (EX/MEM.RegisterRd = ID/EX.RegisterRs))
and (MEM/WB.RegisterRd = ID/EX.RegisterRs)) Forward = 01

if (MEM/WB.RegWrite
and (MEM/WB.RegisterRd ≠ 0)
and not(EX/MEM.RegWrite and (EX/MEM.RegisterRd ≠ 0)
       and (EX/MEM.RegisterRd = ID/EX.RegisterRt))
and (MEM/WB.RegisterRd = ID/EX.RegisterRt)) Forward = 01
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8161362

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档