Ye exercises ek ladder climb karti hain. L1 Recognition (kya tum ise naam de sakte ho?) → L2 Application (kya tum formula mein plug in kar sakte ho?) → L3 Analysis (kya tum explain kar sakte ho kyun ek number aata hai?) → L4 Synthesis (kya tum ideas combine kar sakte ho?) → L5 Mastery (kya tum ek choice design aur defend kar sakte ho?).
Har problem ka ek full worked solution ek collapsible callout ke andar chhupa hua hai — use cover karo, khud try karo, phir reveal karo. Ye page tumhara self-test hai parent topic ke liye.
Shuru karne se pehle, ek shared toolbox. Hum Amdahl's Law ko baar baar use karenge, toh aao ensure karein ki har symbol samajh aaya ho.
(a) ILP — bahut saare independent instructions, ek stream. Ye superscalar idea hai.
(b) TLP — bahut saare independent streams (tabs), alag cores.
(c) DLP — ek instruction, bahut saara data. Dekho SIMD-Vector-Processing. Ye ILP NAHI hai (sirf ek instruction!) aur TLP bhi NAHI hai (sirf ek thread!).
(d) TLP — do threads ek core share karte hain. Ek core ke andar execution units share karna fir bhi thread-level hai, kyunki streams independent programs hain.
Recall Solution 1.2
Jhooth. Issue width n ek ILP knob hai — ye ek thread ko uske apne independent instructions per cycle mein zyada execute karke faster khatam hone deta hai. Threads ki sankhya ek TLP knob hai (cores / hardware contexts). Ye orthogonal dials hain: tum ek badhao doosra fixed reh sakta hai.
Plug in karo: serial fraction 1−f=0.2, parallel part f/n=0.8/4=0.2.
SILP=0.2+0.21=0.41=2.50×
Dhyan do ki serial 0.2 already pura parallel part ke barabar hai — isliye hum 4× ke kareeb bhi nahi pohanchte.
Recall Solution 2.2
(a) S=0.05+0.95/81=0.05+0.118751=0.168751=5.93×.
(b) S=0.05+0.95/641=0.05+0.01484381=0.06484381=15.42×.
Aath guna zyada cores (8 → 64) se sirf ~2.6× zyada speedup mila. Serial 0.05 hume choke kar raha hai.
Recall Solution 2.3
ILP aur TLP yahan independent multiplicative factors hain (har thread individually ILP win enjoy karta hai):
Scombined=SILP×STLP=2.11×7.46=15.74×
(parent ke 15.7× se match karta hai).
(a) S=0.9+0.1/41=0.9251=1.081×. ✓
(b) Serial dependency chain (pointer chasing — tum next load nahi kar sakte jab tak current load return nahi karta) 1−f=0.9 pin karta hai; woh 0.9 term denominator dominate karta hai chahe machine kitni bhi wide ho.
n=16: S=0.9+0.1/161=0.906251=1.103×. 4→16 wide jaane se hum 1.081 se 1.103 tak gaye — ek rounding error. Isliye Memory-Level-Parallelism aur pointer-chasing latency aisi code mein dominate karti hain.
Recall Solution 3.2
Design A (pure ILP):SA=0.4+0.6/61=0.4+0.11=0.51=2.00×.
Design B (TLP × per-thread ILP):
Per-thread ILP: SILP=0.4+0.6/21=0.71=1.4286×.
TLP across 4 cores: STLP=0.1+0.9/41=0.3251=3.0769×.
Combined: 1.4286×3.0769=4.396×.
Design B jeet jaata hai (4.40× vs 2.00×) kyunki deep ILP diminishing returns hit karta hai (woh f=0.6 ceiling), jabki cores mein kaam spread karna abundant algorithmic parallelism p=0.9 exploit karta hai. Ye industry ka multicore ki taraf swing hai — dekho Power-Performance-Tradeoffs.
(a) (8,1) jeetataa hai (2.58×). ILP yahan almost useless hai (f=0.15 ceiling ≈1.18×), toh wide cores wasted silicon hain. Thread count hi ek lever hai jisme headroom hai.
(b) Haan, SMT plausibly teeno se behtar hai. Bottleneck latency hai, throughput nahi: har thread ek memory load return hone ka wait karta hua stall karta hai (pointer chasing). SMT ek core ko allow karta hai ki jab thread T1 ek load miss par stalled ho, tab thread T2 ki ready instructions execute kare — otherwise-dead cycles fill karke. Ye memory latency ko useful work mein convert karta hai bina algorithm ko zyada parallel kiye. Ye exactly us weakness (load-to-use stalls) par directly attack karta hai jo ILP aur naive multicore dono hide karne mein fail karte hain. Ye Memory-Level-Parallelism hai jo threading ke through harvest hota hai.
Recall Solution 5.2
S=100, N=128 set karo: (1−p)+p/1281=100⇒(1−p)+128p=0.01.
1−p+0.0078125p=0.01⇒1−0.9921875p=0.01⇒p=0.99218750.99=0.997797.
Toh p≈0.9978 — 99.78% kaam parallel hona chahiye; sirf 0.22% serial ho sakta hai. Plain words mein: code almost perfectly dividable hona chahiye jisme essentially koi setup, synchronization, ya final-merge step na ho. Real reason fail hota hai: synchronization aur shared-data overhead (locks, 128 cores ke beech cache-coherence traffic, thread spawn/join) easily 0.22% se zyada kha jaata hai, effective serial fraction badhata hai aur speedup claim se kaafi neeche aa jaata hai.