MIPS Pipeline Forwarding (двойная опасность для данных) - PullRequest
7 голосов
/ 17 ноября 2011

В Книге Паттерсона и Хеннесси:

Но нельзя ли считать это опасностью EX:

Почему пересылка выполняется на этапе MEM? И как? С 1 стойлом (для 2-го добавления мне понадобится результат от EX в следующем EX)?

Ответы [ 2 ]

7 голосов
/ 17 ноября 2011

Используемый документ http://www.cs.cornell.edu/courses/cs3410/2011sp/faq/faq_pa1.html

Я перепишу условия опасности EX и MEM (отбрасывание! = 0 часть для простоты), прежде чем мы примем во внимание «двойную опасность данных» ( оригинальные правила ):

EX Hazard

 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, чтобы формулы были короче

MEM Hazard (исходное состояние)

 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) одновременно:

add $1, $1, $2 
add $1, $1, $3 
add $1, $1, $4

или (цикл выпуска промаркирован ** сверху и снизу)

                **   
add C+A -> A ... A
           v     ?  
     add B+A -> A
                v   
          add C+ A -> A     
                **     

По моей ссылке, после учета двойной опасности EX + MEM: (без! = 0 и переупорядоченных логических терминов), Обновлены правила MEM Hazard :

Давайте пересмотрим условия пересылки для опасности MEM, чтобы позаботиться о «двойных» опасностях данных

 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 _ *

 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.

Попробую проиллюстрировать:

add C+A -> A     A'
                 v?  (forwarding to 3rd instruction) 
           A -> A''
                v?
          add C+A -> A          

так, для третьей инструкции исходные правила скажут, что оба A' из первой инструкции и A'' из второй инструкции должны быть переданы (но мультиплексирование не может быть подано из двух источников в один момент времени). И изменение условия опасности MEM говорит о том, что A' не следует пытаться пересылать, если существует активная переадресация A'', которая более поздняя.

Итак, ваш рисунок прав, будет 2 EX Hazards forwarding ; Но перенаправление MEM-опасностей не следует пытаться, если уже есть активное перенаправление EX Hazard.

2 голосов
/ 09 января 2012

Это явно ошибка в 4-м издании книги (круглые скобки, например). Любопытно, что самое последнее издание книги (пересмотренное 4-е издание) добавляет пропущенное закрытие ')', но ... заканчивается неверным условием все еще :

enter image description here

Я думаю, что это будет правильная версия условий:

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
...