Tomasulo's algorithm
5.3.3· Hardware › Advanced Microarchitecture
Tomasulo Kya Problem Solve Karta Hai?
Register Name Problem (WAR/WAW hazards):
DIV R1, R2, R3 # Slow: takes 40 cycles
ADD R4, R1, R5 # Must wait for DIV (true dependency)
SUB R1, R6, R7 # Overwrites R1 - WAW hazard with DIV!
MUL R8, R1, R9 # Which R1? The DIV result or SUB result?Tomasulo ke bina:
ADDwait karta hai (sahi—DIV ka result chahiye)SUBwait karta hai chahe use DIV ki zaroorat nahi (name R1 pe false dependency hai)MULis pile-up se block hai
Tomasulo ka solution: Hardware mein Register renaming. Algorithm track karta hai "woh kaun produce karega jo mujhe chahiye?" instead of "kaunse register name mein woh hai?"
Tomasulo Kaise Kaam Karta Hai: Teen Key Structures
Badi Baat: Instructions register names pe nahi ladte. Woh reservation station slots pe ladte hain. RS ka naam ek temporary register naam ban jaata hai.
Algorithm: Teen Stages
Stage 1: Issue (Dispatch)
Kya hota hai:
- Queue se agla instruction fetch karo
- Check karo ki corresponding functional unit mein free reservation station hai ya nahi
- Agar haan: RS allocate karo, operands registers se padho ya producing RS ka tag copy karo
- Destination register ka tag update karo is RS ki taraf point karne ke liye
Yeh kyun kaam karta hai:
DIV R1, R2, R3 # Issues to Mult1. R1.tag ← Mult1
SUB R1, R6, R7 # Issues to Add1. R1.tag ← Add1 (overwrites!)Ab R1 Add1 ki taraf point karta hai, Mult1 ki taraf nahi. Baad mein R1 padhne wali instructions Add1 ka wait karengi, purane DIV ka nahi. DIV ka result CDB pe broadcast hoga, lekin ab koi sun nahi raha—WAW hazard eliminate ho gaya.
Structural hazard: Agar koi free RS nahi, toh instruction Issue pe stall karti hai. Yeh over-subscription ko rokta hai.
Stage 2: Execute
Kya hota hai:
- CDB monitor karo. Jab koi needed operand aata hai (
QjyaQkkisi broadcast tag se match kare), value capture karo aur tag clear karo - Jab dono operands ready hon (
Qj == NULLaurQk == NULL), instruction ko functional unit pe execution ke liye bhejo - Execution multiple cycles le sakti hai (jaise DIV ke liye 40, MUL ke liye 5)
CDB monitor kyun karte hain?
Add1 waits for Mult2 (Qj = Mult2, Vj = empty)
Mult2 finishes, broadcasts: <Mult2, 3.14>
Add1 sees "Mult2", grabs 3.14, clears Qj
Add1 now has both operands, starts execution
Scoreboard stalls nahi: Simple scoreboards ke unlike, Tomasulo WAR hazards pe stall nahi karta. Agar SUB R1, R6, R7 issue hota hai jab ADD R4, R1, R5 execute ho raha hai, toh SUB ko ek naya RS tag milta hai (Add2). ADD ke paas abhi bhi purana R1 value hai ya apne producer ka wait kar raha hai—use koi farq nahi padhta ki R1 ka tag badal gaya.
Stage 3: Write Result (Broadcast)
Kya hota hai:
- Functional unit finish karta hai. Woh CDB pe
<RS_name, result_value>broadcast karta hai - Sab reservation stations aur register file entries jo
RS_namesun rahi hain woh value latch karti hain - Producing RS free ho jaata hai (deallocate)
- Destination register ka tag clear ho jaata hai (agar woh abhi bhi is RS ki taraf point kar raha hai)
Critical detail: "agar woh abhi bhi is RS ki taraf point kar raha hai." Agar kisi baad ki instruction ne tag overwrite kar diya (WAW case), toh register is broadcast ko ignore kar deta hai. Example:
Mult1 (R1 ← ..) finishes, broadcasts <Mult1, 7>
But R1.tag = Add1 (from a later SUB R1, ...)
R1 ignores the broadcast. Add1 will overwrite R1 later.
Worked Example: Poora Dance
Code:
1. MUL R1, R2, R3 # 5 cycles
2. ADD R4, R1, R5 # 2 cycles (waits for R1)
3. SUB R1, R6, R7 # 2 cycles
4. DIV R8, R1, R9 # 40 cycles (waits for new R1 from SUB)Initial state: R2=2, R3=3, R5=10, R6=20, R7=8, R9=2. Sab RS free. Sab tags NULL.
| Cycle | Event | RS State | Register Tags |
|---|---|---|---|
| 1 | MUL issues to Mult1 | Mult1: MUL, Vj=2, Vk=3, Qj=NULL, Qk=NULL |
R1.tag = Mult1 |
| 2 | ADD issues to Add1 | Add1: ADD, Vj=NULL, Vk=10, Qj=Mult1, Qk=NULL |
R4.tag = Add1 |
| 3 | SUB issues to Add2 | Add2: SUB, Vj=20, Vk=8, Qj=NULL, Qk=NULL |
R1.tag = Add2 (overwrites!) |
| 3 | SUB immediately execute hoti hai (operands ready) | ||
| 4 | DIV issues to Mult2 | Mult2: DIV, Vj=NULL, Vk=2, Qj=Add2, Qk=NULL |
R8.tag = Mult2 |
| 5 | SUB finishes, broadcasts <Add2, 12> |
Mult2: Qj clears, Vj=12 | R1.tag = NULL, R1.value = 12 |
| 5 | DIV execute shuru (ab dono operands hain) | ||
| 6 | MUL finishes, broadcasts <Mult1, 6> |
Add1: Qj clears, Vj=6 | R1 ignore karta hai (tag ≠ Mult1) |
| 6 | ADD execute shuru | ||
| 8 | ADD finishes, broadcasts <Add1, 16> |
R4.tag = NULL, R4.value = 16 | |
| 45 | DIV finishes, broadcasts <Mult2, 6> |
R8.tag = NULL, R8.value = 6 |
Key observations:
- Cycle 3:
SUBissue hoti hai aur immediately start karti hai kyunki R6/R7 ready hain. WohMULka wait nahi karti, chaheMULprogram order mein pehle R1 likhta hai (WAR eliminate ho gaya). - Cycle 5:
DIVAdd2(naye R1) ka wait kar raha tha,Mult1ka nahi. Register renaming ne dependency sahi route kiya. - Cycle 6: Jab
MULfinish karta hai, R1 uska result ignore karta hai kyunki R1.tagAdd2ho gaya tha. Koi value nahi jaati—ADDne use Issue pe hi capture kar liya tha (Qj=Mult1). - Parallelism:
MUL(cycles 1-6) aurSUB(cycles 3-5) overlap karte hain.ADDcycle 6 pe start hoti hai,SUByaDIVka wait nahi karta.
Yeh step kyun? Har baar jab CDB pe ek operand aata hai, hum us producer ko uske consumers se decouple kar rahe hain. Producer ko nahi pata kaun wait kar raha hai; consumers ko nahi pata producer kab finish karega. CDB ek "anonymous drop box" hai.
Derivation: Register Renaming Kyun Kaam Karta Hai?
First principles:
- True dependency (RAW):
BkoAka result chahiye. Yeh unavoidable hai—Bko wait karna hi padega. - Name dependency (WAR/WAW):
BaurAsame register naam reuse karte hain, lekinBkoAki value nahi chahiye.
Tomasulo mein:
- Har instruction jo write karti hai use Issue time pe ek unique tag (RS name) milta hai.
- Readers current writer ka tag capture karte hain.
- Agar naya writer aata hai, use naya tag milta hai. Purane readers abhi bhi purane tag ki taraf point karte hain.
Proof ki WAW eliminate ho gaya:
Time t: MUL R1, ... issues. R1.tag ← Mult1.
Time t+1: SUB R1, ... issues. R1.tag ← Add2 (overwrites Mult1).
t+1 ke baad issue hone wali koi bhi instruction jo R1 padhe woh Add2 ka wait karegi, Mult1 ka nahi. MUL ka result broadcast hoga, lekin R1 use latch nahi karega (tag mismatch). Yeh renaming ke equivalent hai: MUL R1_old, ..; SUB R1_new, .... RS naam hi physical register hai.
Proof ki WAR eliminate ho gaya:
Time t: ADD R4, R1, ... issues. ADD.Qj ← (jo bhi R1.tag tha, ya R1.value le leta hai).
Time t+1: SUB R1, ... issues. R1.tag badal jaata hai.
ADD R1 re-check nahi karta. Uske paas pehle se woh value ya tag hai jo use chahiye. SUB bina ADD ko corrupt kiye R1 overwrite kar sakta hai.
Mathematical model: Maano instruction ka write time hai, instruction ka operand-ready time hai. Renaming ke bina: Renaming ke saath: Hum ko stale writers se decouple karte hain, parallelism badhti hai.
Common Mistakes
Tomasulo Scoreboards Se Better Kyun Hai
| Feature | Scoreboard (CDC 6600) | Tomasulo |
|---|---|---|
| WAW/WAR hazards | Stalls | Renaming se eliminate |
| Operand fetch | Register file se RAW clear hone ke baad | CDB se (bypassing) |
| Distributed control | Centralized functional unit table | RSs mein distributed |
| Load/Store ordering | In-order | Out-of-order ho sakta hai (memory disambiguation ke saath) |
Key insight: Scoreboards hazards detect karke stall karte hain. Tomasulo renaming se false hazards eliminate karta hai, toh stall karne ki zaroorat kam hoti hai.
Recall 12-Saal Ke Bachche Ko Samjhao
Socho tum homework kar rahe ho, aur tumhare paas 5 math problems hain. Problem 2 ko Problem 1 ka answer chahiye, lekin Problem 3, 4, 5 bilkul independent hain.
Bewaqoofi wala tarika: Order mein karo. Tum wahan baithke Problem 1 ke khatam hone ka wait karte ho, Problem 3 padhne se pehle bhi.
Tomasulo wala tarika: Tumhare paas sticky notes hain. Jab tum Problem 1 shuru karte ho, answer line pe ek note chipkate ho: "Problem 1 yahan answer likhega." Phir tum Problem 3 padhte ho—use Problem 1 ka answer nahi chahiye, toh tum use immediately solve karna shuru kar do. Jab Problem 1 finish hoti hai, tum sticky note pe answer likhte ho aur announce karte ho "Problem 1 done hai, answer 42 hai!" Problem 2 yeh sunta hai, 42 le leta hai, aur solve karna shuru kar deta hai. Itne mein tum Problem 3 aur 4 bhi finish kar chuke ho.
Sticky note reservation station tag hai. Announcement CDB broadcast hai. Tomasulo ek bahut organized homework system hai jo kabhi time waste nahi karta wait karne mein jab tak zaroorat na ho.
Connections
- register-renaming: Tomasulo original hardware implementation hai
- out-of-order-execution: Tomasulo compiler ki help ke bina dynamic OO enable karta hai
- reorder-buffer: Tomasulo ke saath pair hota hai precise exceptions ke liye (modern CPUs)
- scoreboarding: Predecessor; Tomasulo CDC 6600 ke scoreboard ko improve karta hai
- instruction-level-parallelism: Tomasulo sequential code se ILP extract karta hai
- memory-disambiguation: Tomasulo ko loads/stores tak extend karta hai (jaise load-store queue)
- common-data-bus: Results ke liye broadcast medium
- data-hazards: RAW/WAR/WAW—Tomasulo WAR/WAW eliminate karta hai
#flashcards/hardware
Tomasulo's algorithm kya problem solve karta hai? :: False dependencies (WAR/WAW hazards) jo register name reuse se hoti hain unhe eliminate karta hai, out-of-order execution allow karta hai jabki sequential execution ka illusion maintain hota hai.
Tomasulo mein teen key structures kya hain?
Ek reservation station kya store karta hai?
Issue stage mein kya hota hai?
Tomasulo mein instruction kab execute hoti hai?
Write Result mein kya hota hai?
<RS_name, result> broadcast karta hai. Us tag ko sun rahi sab RSs aur registers value latch karti hain, aur RS free ho jaata hai.