Ek load-use data hazard tab hota hai jab load instruction ke bilkul baad wali instruction loaded data pe depend karti hai. ALU-ALU hazards ke unlike (jinhe forwarding solve kar leta hai), load hazards mein stall zaroori hai kyunki:
Load MEM stage mein complete hota hai (cycle 4 ka end)
Dependent instruction ko data apne EX stage ke START mein chahiye (bilkul agle instruction ke liye cycle 4 ka start)
Forwarding yeh gap bridge nahi kar sakti — data tab exist hi nahi karta jab zaroorat hoti hai (woh sirf cycle 4 ke end mein appear hota hai)
Cycle: 1 2 3 4 5
lw $2, 0($1) IF ID EX MEM WB ← data available END of cycle 4 (MEM)
add $4, $2, $3 IF ID EX MEM ← needs $2 START of cycle 4 (EX)
MEM/WB → EX forwarding ke saath bhi, add instruction ka EX stage cycle 4 ke start mein shuru hota hai, lekin load ka data cycle 4 ke end mein hi ready hota hai. Data tab exist hi nahi karta jab ALU ko chahiye.
1-cycle stall insert karne ke baad:
Cycle: 1 2 3 4 5 6
lw $2, 0($1) IF ID EX MEM WB
add $4, $2, $3 IF ID (stall) EX MEM ← add ek extra cycle ID mein ruka
Ab add cycle 5 mein EX execute karta hai. Load ka data (cycle 4 ke end mein available, MEM/WB mein held) MEM/WB → EX se cycle 5 mein forward hota hai. Perfect.
Ek ideal 5-stage pipeline ke liye bina hazards ke, CPI = 1.0. Har load-use hazard 1 stall cycle add karta hai:
CPIpipeline=1.0+(stall frequency)×1
Agar 20% instructions loads hain aur 50% loads mein immediate dependencies hain:
CPI=1.0+(0.20×0.50)×1=1.10
Iska matlab 10% performance loss hai ek ideal pipeline ke comparison mein.
Mitigation strategies:
Compiler scheduling: Load delay slots fill karne ke liye independent instructions reorder karo
Out-of-order execution: Hardware dynamically instructions reorder karta hai (advanced processors)
Better caches: Faster memory effective load latency reduce karti hai (hazard eliminate nahi hota, lekin overall CPI improve hoti hai)
Recall Ek 12-saal ke bachche ko explain karo
Socho tum apne doston ke saath ek sandwich assembly line bana rahe ho:
Person A pantry se bread laata hai (jaise lw memory se load karta hai)
Person B ko chahiye ki woh us bread par turant peanut butter lagaye
Problem: Person A bread apni turn ke bilkul end mein wapas laata hai, lekin Person B ko bread apni turn ke bilkul start mein chahiye — aur unki turns overlap karti hain! Jab Person B spreading station par pahunchta hai, Person A abhi bread lane ke kaam se return nahi kiya hota.
Solution: Person B ko spreading station par wait (stall) karna padta hai ek extra turn kuch nahi karte hue. Iss beech, Person A pantry trip finish karta hai. Ab jab Person B finally spread karta hai, bread ready hoti hai.
Ek "forwarding path" aise hai jaise Person A bread directly Person B ko hand kare instead of table par rakhne ke — isse time bachta hai, lekin tabhi kaam karta hai jab Person A ke paas bread pehle se ho! Hum kuch aisa forward nahi kar sakte jo exist hi nahi karta, toh hume wait karna padta hai.
Ek hazard jo tab hota hai jab load ke bilkul baad wali instruction loaded data pe depend karti hai. Isme stall zaroori hai kyunki data MEM stage ke end tak available nahi hota, lekin dependent instruction ko woh usi cycle mein apne EX stage ke start mein chahiye.
Forwarding akele load-use hazards kyun solve nahi kar sakti?
Forwarding sirf woh data route kar sakti hai jo pehle se exist karta ho. Load ka data MEM stage ke end mein available hota hai (cycle 4), lekin agle instruction ko woh apne EX stage ke start mein chahiye (bhi cycle 4). Forwarding data ko time mein ulta nahi bhej sakti.
Kaun si teen conditions load-use stall trigger karti hain?
1) ID/EX.MemRead = 1 (EX stage mein load hai), 2) ID/EX.RegisterRt, IF/ID.RegisterRs ya RegisterRt se match karta hai (register dependency), 3) ID/EX.RegisterRt ≠ 0 (zero register nahi hai).
1) PC unchanged rakho (nayi instruction fetch mat karo), 2) IF/ID register unchanged rakho (same instruction dobara read karo), 3) Saare ID/EX control signals zero karo (EX stage ko NOP banao), 4) MEM aur WB stages normally proceed karti rahein.
Exactly 1 cycle. Stall ke baad, MEM/WB se EX pe forwarding remaining gap bridge kar deti hai.
Load ke baad store hazard kyun create nahi karta?
Ek store apna source (store-data) register MEM stage mein use karta hai (cycle 5 agar woh load ke bilkul baad aaye), EX stage mein nahi. Load apna result cycle 4 ke end tak produce kar deta hai, toh MEM/WB se MEM pe forwarding bina stall ke kaam karti hai.
Agar 20% instructions loads hain aur 40% loads mein immediate dependencies hain, toh CPI kya hai?
CPI = 1.0 + (0.20 × 0.40) × 1 = 1.08. Har load-use stall 1 cycle add karta hai, aur woh saari instructions ke 8% ke liye hoti hain.
Kaun si compiler optimization load-use stalls reduce karti hai?
Instruction scheduling — code ko reorder karna taaki loads ke baad independent instructions aayein, "load delay slot" ko stalls ki jagah useful kaam se fill kiya jaaye.