Shuru karne se pehle, yeh woh ek formula hai jis par zyaadatar problems depend karti hain. Hum ise repeat kar rahe hain taaki koi bhi symbol use hone se pehle naam liya ja sake.
(a) RAW (Read After Write): MUL woh R1read karta hai jo ADD ne abhi write kiya. Yeh ek true data dependency hai — value genuinely flow karni chahiye. Renaming ise nahi hata sakti.
(b) WAW (Write After Write): dono instructions R1write karti hain. Ek false (naam-wali) dependency. Renaming ise eliminate karti hai har write ko alag physical register pe bhejke.
(c) WAR (Write After Read): pehla R1read karta hai, doosra R1write karta hai. Ek false (anti-)dependency. Renaming ise eliminate karti hai taaki writer woh value na chhupa de jo reader ko abhi bhi chahiye.
"6 execution ports" = 6 jagah jahan instructions execute ke liye bheji ja sakti hain har cycle mein, yaani total execution back-end 6/cycle accept kar sakta hai (Fi functional units mein spread hokar).
4 wala W hai. Dhyan do ki back-end (6) front-end (4) se zyaada wide hai — yeh ek common design hai taaki narrow front-end back-end se kabhi starved na ho.
Dependency: D⋅LavgW⋅ROB=3×24×128=6512=85.3.
IPC=min(4,6.67,85.3)=4Front-end width bottleneck hai; machine ke paas kaafi units aur lookahead hai.
Recall Solution L2.2
Pehle, FP edge case. Is program mein pFP=0 hai: koi bhi instruction FP unit use nahi karti. Formula ke edge-case rule se, FFP/pFP=2/0→∞ — ek infinitely high ceiling jo kabhi sabse chhoti nahi ho sakti — isliye hum FP term ko bilkul drop kar dete hain aur woh neechey koi role nahi khelti.
W=4.
Integer: 0.33=10
FP: pFP=0⇒term dropped (kabhi bottleneck nahi).
Memory: 0.62=3.33 ← tightest
Branch: 0.11=10
Dependency: D⋅LavgW⋅ROB=3×24×128=85.3.
IPC=min(4,FU=3.33min(10,3.33,10),85.3)=3.33
Bottleneck: memory ports. Sirf 2 load/store units hain, lekin 60% kaam unhe chahiye.
Figure dekho: har colored bar ek ceiling hai. Sabse chhota bar jeetता hai — yeh min ka visual matlab hai. L2.1 mein width bar sabse chhota hai; L2.2 mein memory bar width bar se neechey gir jaata hai aur limiter ban jaata hai. Dhyan do ki L2.2 mein koi FP bar nahi hai — ek dropped pi=0 term simply appear hi nahi karta.
FU ceilings unchanged (same 40/20/30/10 mix): min(0.43,0.22,0.32,0.11)=min(7.5,10,6.67,10)=6.67 (memory).
Dependency: D⋅LavgW⋅ROB=4×34×8=1232=2.67.
IPC=min(4,6.67,2.67)=2.67Ab dependency term dominate karta hai. Physically: ROB (lookahead window) itna chhota hai ki machine kaafi aage nahi dekh sakti taaki long chains stall hone par independent kaam dhundh sake. Functional units idle baithe hain wait mein — kaafi execution muscle hai, lekin koi independent instructions feed karne ke liye nahi hain.
Recall Solution L3.2
Current bottleneck (L2.2 se) memory hai: Fmem/pmem=2/0.6=3.33. FP term drop hai (pFP=0). Hum ab har fix ke liye min ki teeno terms dikhate hain.
Fix A (W=6): sirf W badalta hai. FU ceilings hain min(0.33,0.62,0.11)=min(10,3.33,10)=3.33. Dependency banta hai 3×26×128=6768=128. Toh
IPCA=min(6,3.33,128)=3.33.
Memory abhi bhi sabse chhota hai — front-end widen karna aur window bada karna dono apni-apni terms badhate hain, lekin koi memory ceiling ko nahi chhota. IPC 3.33 rehta hai; silicon waste hota hai.
Fix B (3rd L/S unit): memory ceiling ban jaata hai 0.63=5.0. FU ceilings min(0.33,0.63,0.11)=min(10,5.0,10)=5.0. Width =4, dependency =3×24×128=85.3. Toh
IPCB=min(4,5.0,85.3)=4.
Fix B kaam karta hai, IPC ko 3.33 se 4 tak uthata hai (ab width-limited hai: 4 teeno mein sabse chhota hai). Asli bottleneck par attack karo, na ki sabse bada-sounding knob par.
Branch (p=0.2): 0.2Fbr≥4⇒Fbr≥0.8 chahiye. 1 chuno.
Saari terms check karo: min(W4,min(4,6.67,5)=4min(2/0.5,2/0.3,1/0.2),dep≫4)=4. ✔
Minimal design: W=4, 2 mem, 2 int, 1 branch. Dhyan do ki integer ko 2 (1 nahi) chahiye tha sirf isliye ki tum fractional unit nahi khareed sakte.
Recall Solution L4.2
In-flight writers ke renaming ke liye available physical registers =192−32=160.
Har in-flight writer ko ek chahiye. In-flight instructions mein write karne wali fraction =0.70.
Toh ROB N entries rakh sakta hai jahan 0.70×N≤160⇒N≤0.70160=228.6.
Sabse bada usable ROB =228 entries.
Interpretation: agar ROB 228 se bada banaaya jaata, toh physical register file pehle dry ho jaati — dono structures ko saath mein size karna padta hai (dekho Register Renaming aur Reorder Buffer).
Design X: ceilings — W=6; mem 2/0.5=4; int 3/0.3=10; branch 1/0.2=5; dep ≫6.
IPCX=min(6,4,10,5,≫6)=4 (memory-limited).
Design Y: ceilings — W=4; mem 3/0.5=6; int 2/0.3=6.67; branch 1/0.2=5; dep ≫4.
IPCY=min(4,6,6.67,5,≫4)=4 (width-limited).
Same IPC = 4 is workload par!
Power ke liye ship karo: Design Y. Yeh IPC 4 narrow front-end (W=4) se achieve karta hai. Front-end width ek core ka sabse zyaada power-hungry hissa hota hai (wide fetch, wide decode, wide rename, zyaada wakeup logic). Y yahan same throughput ke liye kam power burn karta hai — power budget mein sensible pick.
Jab X jeetता hai — alternate workload. Ek compute-heavy mix lo 15% memory / 65% integer / 20% branch (abhi bhi 0% FP). Dono designs ko us par recompute karo:
Design X (W=6, 2 mem, 3 int, 1 branch): mem 0.152=13.33; int 0.653=4.62; branch 0.21=5; dep ≫6. Toh IPCX=min(6,13.33,4.62,5,≫6)=4.62 (integer-limited).
Design Y (W=4, 3 mem, 2 int, 1 branch): mem 0.153=20; int 0.652=3.08; branch 0.21=5; dep ≫4. Toh IPCY=min(4,20,3.08,5,≫4)=3.08 (integer-limited).
Ab X jeetता hai, 4.62 vs 3.08. Kam memory traffic aur zyaada integer kaam ke saath, X ka extra ALU (3 vs 2) aur uska wider front-end (6 vs 4) dono pay off karte hain, jabki Y ke 2 ALUs 65% integer stream par choke karte hain. Moral: koi bhi design "best" nahi hai — winner program ke mix par depend karta hai.
Neechey wala figure pehle (50/30/20) comparison ko bars mein convert karta hai. Ise aise padho: har design ke liye, sabse chhota bar woh ceiling hai jo bind karta hai. Design X ka memory bar (4) uska sabse chhota hai — X memory-limited hai. Design Y ka width bar (4) uska sabse chhota hai — Y width-limited hai. IPC 4 par dashed line dikhati hai ki dono alag-alag routes se ek hi height par land karte hain, jo is exercise ka poora point hai.
Recall Solution L5.2
"Instructions per branch" mein kaam karo as natural chunk.
Instructions ka fraction jo branches hain =0.20, toh average par har 1/0.20=5 instructions mein 1 branch hoti hai.
Misprediction rate =1−0.92=0.08. Toh mispredict average par har 5/0.08=62.5 instructions mein hota hai.
Un 62.5 instructions ke liye cycles: useful cycles =62.5/4=15.625 (IPC 4 par running), plus ek penalty =14 cycles.
Effective IPC =15.625+1462.5=29.62562.5=2.11.
Lesson: ek deep-pipeline wide machine par 8% miss rate real throughput almost half kar deta hai — exactly isliye branch prediction accuracy itne silicon ki haqdar hai. Is dynamic-scheduling cost ko compiler-scheduled VLIW Architecture approach se compare karo, aur note karo ki Tomasulo's Algorithm woh out-of-order engine provide karta hai jo mispredicts ke beech IPC ko W ke paas rakhta hai.