Data EX stage mein produce hota hai (ALU ops ke liye) → cycle n+2 mein available (EX at n, MEM at n+1, WB at n+2)
Data dependent instruction ko ID stage mein chahiye
Agar dependent instruction cycle m mein hai, use data cycle m+1 tak chahiye (ID stage)
Stalls required: (n+2)−(m+1)=n−m+1
Consecutive instructions ke liye (m=n+1): Stalls = n−(n+1)+1=0 stalls? Galat! Yeh ignore karta hai ki data register file mein WB complete hone ke baad hi likha jaata hai.
Correct calculation: Agar instruction i cycle n mein EX mein hai, toh result cycle n+2 (WB ke end) par likha jaata hai. Agar instruction i+1 cycle n+1 mein ID mein hai, toh woh cycle n+1 mein read karta hai. Gap = (n+2)−(n+1)=1 cycle... lekin register file read clock edge ke pehle hoti hai jahan write hoti hai. Actual gap = 2 cycles ALU-to-ALU dependency ke liye.
ForwardA ke liye (ALU input 1, Rs ke corresponding):
if (EX/MEM.RegWrite
and EX/MEM.RegisterRd ≠ 0
and EX/MEM.RegisterRd = ID/EX.RegisterRs)
then ForwardA = 10
else if (MEM/WB.RegWrite
and MEM/WB.RegisterRd ≠ 0
and MEM/WB.RegisterRd = ID/EX.RegisterRs
and not(EX/MEM hazard condition)) // Priority check
then ForwardA = 01
else ForwardA = 00
Priority check kyun? Agar EX/MEM aur MEM/WB dono match karein, toh hum more recent value (EX/MEM) chahte hain, isliye MEM/WB forwarding tab hi hoti hai jab EX/MEM match nahi karta.
ForwardB logic identical hai, lekin ID/EX.RegisterRt se compare karti hai.
3.1.05-Register-file-design - Woh hardware jise forwarding bypass karti hai
6.2.03-Compiler-optimization-techniques - Hazards minimize karne ke liye instruction scheduling
Recall 12-Saal Ke Bacche Ko Samjhao
Socho tum ek assembly line par Lego spaceships bana rahe ho. Tumhare paas 5 stations hain: pieces uthao (IF), instructions check karo (ID), pieces jodo (EX), ek box se special parts lagao (MEM), aur finished section shelf par rakh do (WB).
Ab, Station 3 ek red wing bana raha hai, aur Station 2 (bilkul peeche) ko wahi red wing body par lagaane ke liye chahiye. Lekin wing abhi shelf par nahi hai — woh Station 3 par abhi bhi ban rahi hai!
Buri solution: Poori line rok lo aur intezaar karo jab tak wing shelf par nahi aa jaati. Slow!
Smart solution (forwarding): Station 3 seedha wing Station 2 ko de deta hai. Pehle shelf par kyun rakhein agar agli wali ko abhi chahiye?
Lekin kabhi kabhi tumhe special parts box (memory) se ek piece chahiye. Woh box slow hai — tumhe jaana padta hai, unlock karna padta hai, aur piece dhundna padta hai. Forwarding ke saath bhi, tumhe ek baar wait karna padega kyunki piece literally exist nahi karta jab tak box nahi khola jaata. Yahi load-use hazard hai.
Forwarding teamwork ki tarah hai: result seedha use pass karo jise abhi chahiye, instead of pehle sab kuch away rakhne ke rules follow karne ke.
#flashcards/hardware
Pipeline mein data hazard kya hota hai? :: Jab ek instruction ko ek register value chahiye jo ek pehli instruction ne abhi tak write nahi ki, kyunki woh pichli instruction abhi bhi pipeline mein hai. Dependent instruction stale data read kar leti.
Teen types ke data hazards kya hain?
RAW (Read After Write - true dependency), WAR (Write After Read - anti-dependency), WAW (Write After Write - output dependency). Simple pipelines mein RAW sabse common hota hai.
Forwarding/bypassing kya hota hai?
Ek technique jo computed results ko pipeline registers (EX/MEM ya MEM/WB) se seedha dependent instructions ke ALU inputs par route karti hai, register file mein write-back ka intezaar kiye bina.
Load-use hazard kya hota hai?
Jab load ke turant baad wali instruction loaded value use karti hai. Forwarding ke saath bhi ek stall cycle zaroori hota hai kyunki data load ke MEM stage complete hone tak exist nahi karta.
5-stage pipeline mein do main forwarding paths kaunse hain?
EX/MEM se EX stage tak (ek cycle purane results ke liye) aur MEM/WB se EX stage tak (do cycle purane results ke liye). Jab dono match karein toh EX/MEM ko priority milti hai.
Forwarding load-use hazards kyun eliminate nahi kar sakti?
Loaded data MEM stage ke end tak exist nahi karta, lekin dependent instruction ko EX stage ke start mein chahiye (ek stage pehle). Data ko exist hone se pehle forward nahi kiya ja sakta.
Load-use hazard mein forwarding ke saath kitne stall cycles chahiye?
Ek stall cycle. Forwarding ke bina, architecture ke hisaab se do ya teen cycles lagte.
Forwarding unit kya hota hai?
Combinational logic jo pipeline registers monitor karta hai, destination aur source registers compare karta hai, aur ALU input multiplexers ke liye ForwardA/ForwardB control signals generate karta hai.
EX/MEM forwarding ko MEM/WB forwarding par priority kyun milti hai?
Kyunki EX/MEM mein more recent result hota hai. Agar do instructions same register write karein, toh dependent instruction ko newer value use karni chahiye.
ForwardA = 10 ka kya matlab hai?
ALU result ko EX/MEM pipeline register se ALU input A (pehla operand) par forward karo. 10 EX/MEM forwarding ka encoding hai.
Hazards ke context mein instruction scheduling kya hota hai?
Ek compiler optimization jo independent instructions ko reorder karti hai taaki load delay slots fill ho sakein aur pipeline stalls minimize ho sakein, program semantics preserve karte hue.
EX-to-EX forwarding opportunity kab banti hai?
Jab EX/MEM.RegWrite = 1 ho, EX/MEM.RegisterRd ≠ 0 ho, aur EX/MEM.RegisterRd ya toh ID/EX.RegisterRs ya ID/EX.RegisterRt ke barabar ho.
Register 0 MIPS aur RISC-V jaise architectures mein hardwired zero hota hai, isliye usme writes se real dependencies nahi banti. R0 ke liye koi forwarding nahi chahiye.
Pipeline bubble kya hota hai?
Pipeline mein insert kiya gaya ek NOP (no operation) execution stall karne ke liye, effectively ek empty pipeline stage banata hai jahan koi useful kaam nahi hota.
Forwarding CPI kaise improve karta hai?
Zyaadatar ALU-to-ALU data hazard stalls eliminate karke. Typical improvement: CPI ≈ 1.975 (sirf stall) se CPI ≈ 1.125 (forwarding ke saath), 1.76× speedup.