5.3.11 · D5 · HinglishAdvanced Microarchitecture
Question bank — Speculative execution
5.3.11 · D5· Hardware › Advanced Microarchitecture › Speculative execution
Shuru karne se pehle, teen plain-word anchors jo neeche har jagah use hote hain:
Sahi hai ya galat — justify karo
Branch predictor ka galat guess kabhi bhi ek architectural register ki value corrupt karta hai.
Galat — ek galat guess sirf microarchitectural state ko pollute karta hai; squashing ROB entries ko commit se pehle discard kar deta hai, isliye official registers ne kabhi bhi woh galat value dekhi hi nahi.
Speculative execution ke liye out-of-order execution ka hona zaroori hai.
Galat — ye dono alag ideas hain. Tum ek in-order pipeline mein bhi branch ke aage speculate kar sakte ho; out-of-order sirf speculation ko zyada profitable banata hai kyunki window fill karne ke liye zyada independent kaam available hota hai.
Agar branch predictor 100% accurate hota, toh mispredictions par zero cycles kharach hote.
Misprediction ke sense mein sahi — lekin tum pehli branch par aur cold code par phir bhi pipeline-fill cost bharoge, kyunki bina history ke predictor ko phir bhi pehla guess banana (aur verify karna) padta hai.
Speculatively execute kiye gaye loads data ko cache mein la sakte hain chahe instruction baad mein squash ho jaaye.
Sahi — yahi Spectre ka poora basis hai: squash architectural effect ko undo kar deta hai lekin cache line warm rehti hai, ek measurable timing footprint leak karti hai.
Ek misprediction penalty bilkul pipeline depth ke barabar hoti hai.
Galat — ye roughly pipeline depth plus refetch latency hoti hai (correct instructions ko wapas fetch mein laana), isliye ye depth akele se kuch cycles zyada hoti hai.
Speculation hamesha net performance win hoti hai kyunki predictors average par 95% se zyada accurate hote hain.
Galat — average accuracy data-dependent branches (parsing,
rand()%2) ko hide kar leti hai jo 50% ke aas paas hote hain, jahan bhari penalty sirf stalling ki cost se zyada ho sakti hai.Speculation band karna CPU ko slower banata hai lekin program ke computed results kabhi nahi badalte.
Computed values ki correctness ke liye sahi — speculation ko results ke liye invisible rehne ke liye design kiya gaya hai; isse disable karna sirf timing side effects aur speedup ko hata deta hai.
Reorder buffer instructions ko us order mein store karta hai jismein woh execute hoti hain.
Galat — ROB program order ke hisaab se ordered hota hai bilkul isliye taaki woh oldest-first commit kar sake; execution finishing order (out-of-order) commit order se decoupled hota hai.
Error dhundo
"Ek baar instruction execute ho jaaye toh uska result register mein likh diya jaata hai, isliye misprediction par hum usse overwrite kar dete hain."
Error "register mein likha jaata hai" mein hai: speculative results ROB mein jaate hain, architectural registers mein nahi, isliye overwrite karne ke liye kuch hota hi nahi — galat entry official register ko kabhi touch kiye bina simply drop ho jaati hai.
"Ek misprediction branch instruction ko uske peeche ki sab cheezein ke saath flush kar deta hai."
Branch instruction correct hai aur wahi hai jo mispredict resolve karti hai; sirf uske baad ki wrong-path instructions squash hoti hain, aur branch normally commit karti hai.
"Kyunki speculation software ke liye invisible hai, Spectre ek software bug hai, hardware issue nahi."
Leak hardware ke speculation ke dauran cache traces chhodne se aata hai; vulnerable behaviour microarchitecture mein hai, isliye ye fundamentally ek hardware design issue hai jiske around software mitigations sirf kaam karte hain.
"Ek 2-bit saturating counter pehli baar galat hone par apni prediction badal deta hai."
Ek saturating counter mein hysteresis hoti hai — ek galat outcome ise sirf ek step (jaise strongly-taken se weakly-taken) move karta hai, isliye actual prediction flip karne ke liye do consecutive misses chahiye, yahi reason hai ki loop exits par sirf ek miss lagti hai.
"Register renaming woh hai jo CPU ko misprediction undo karne deta hai."
Renaming false data dependencies hatane ke liye exist karta hai taaki instructions out-of-order run kar sakein; undo mechanism ROB hai jo uncommitted entries discard karta hai — related machinery hai, lekin alag kaam hai.
"Ek instruction commit karna matlab hai uska execute hona shuru ho gaya."
Ulta hai — commit aakhri step hai (result pehle se compute ho chuka hai, use architectural state mein move karna); execution pehle hua tha aur uska result ROB mein wait kar raha tha.
"Speculation sirf ek predicted path pe chalti hai, isliye isse attack nahi kiya ja sakta."
Ek akela mispredicted path bhi transiently secret memory ko touch kar sakta hai aur squash se pehle cache imprint chhod sakta hai, jo bilkul wahi attack surface hai jo Spectre exploit karta hai.
Why questions
CPU speculate karne se pehle state checkpoint kyun karta hai, baad mein nahi?
Kyunki agar guess galat ho toh use exact pre-branch situation restore karni hogi; speculation ke baad liya gaya checkpoint pehle se wrong-path work se contaminated hoga.
Deep pipeline speculation ka reason kyun hai aur mispredictions hurt kyun karte hain?
Deep pipeline lambi branch-resolution delays create karta hai (woh bubble jo speculation fill karti hai), lekin iska matlab hai flush karne ke liye bahut saari in-flight wrong-path instructions bhi hain — wahi depth motivation bhi hai aur penalty bhi.
Kuch real CPUs kuch branches par speculate karne ki jagah deliberately stall kyun karte hain?
Ek confidence estimator near-50/50 branch detect kar sakta hai, jahan speculate karna resolution ke short wait se average mein zyada cost karta hai — isliye stalling sasta bet hai.
Input data sort karna kabhi kabhi branchy code ko dramatically faster kyun banata hai?
Sorting same outcomes ko group karta hai, ek unpredictable data-dependent branch ko same-direction outcomes ki lambi runs mein badal deta hai jo predictor aasaani se seekh leta hai — misprediction rate cut ho jaati hai.
Branchless code (cmov, bitwise tricks) unpredictable branches mein help kyun karta hai?
Branch ko poora remove kar deta hai, isliye mispredict karne ke liye kuch hota nahi aur koi penalty nahi — possible flush ko guaranteed chhoti computation se trade kar lena.
Speculative loads architectural memory ko immediately update kyun NAHI karni chahiye?
Wrong-path store otherwise woh bytes likh deta jo correct program ne kabhi intended nahi kiye, software-visible memory corrupt kar deta — isliye stores commit tak hold kiye jaate hain.
Ek superscalar, out-of-order core ek simple scalar se speculation se zyada benefit kyun extract kar sakta hai?
Multiple issue slots aur exploit karne ke liye ILP ke saath, ek wider superscalar core ke paas speculated window fill karne ke liye bahut zyada independent kaam ready hota hai, isliye har correct guess zyada pay off karta hai.
Branch predictor ko Spectre ke liye attack surface kyun maana jaata hai?
Attacker ise patterns feed karke train kar sakta hai, ek chosen misprediction force karta hai jo victim ko secret data touch karne wale wrong path par steer karta hai — predictor ek lever ban jaata hai jo attacker control karta hai.
Edge cases
Jab loop ki pehli iteration chalti hai aur predictor ki koi history nahi hoti toh speculation ke saath kya hota hai?
Woh ek default (jaise weakly-taken) initial state par fall back karta hai, isliye early branches tab tak mispredict ho sakti hain jab tak counter warm up nahi ho jaata — steady-state accuracy se alag "cold predictor" cost.
for (i=0; i<100; i++) loop ki aakhri iteration par, ek misprediction essentially unavoidable kyun hai?
Predictor ne 99 taken outcomes se "taken" seekh liya hai, isliye woh confidently taken predict karta hai bilkul tab jab loop ko exit karna hota hai (not taken) — boundary par ek guaranteed miss.
Agar ek mispredicted path divide by zero ya fault kare, toh kya program crash karta hai?
Nahi — speculative instructions par faults ROB mein pending rakhe jaate hain aur sirf tab raise kiye jaate hain jab woh instruction commit reach kare; squashed faulting instruction silently discard ho jaati hai.
Ek branch jo hamesha har baar taken hoti hai uska correctness effect kya hai?
Warm-up ke baad predictor 100% sahi hota hai, isliye ye essentially zero misprediction penalty contribute karta hai — speculation ke liye ideal case.
Agar speculation poori tarah disable ho (jaise har branch se pehle lfence), toh worst-case behaviour kya hai?
Har branch resolve hone tak stall kar deta hai, isliye throughput non-speculative machine ki taraf drop ho jaata hai — correct results, lekin pipeline har branch delay mein idle baihi rehti hai.
Purely 50/50 random branch ke liye, predictor ki sophistication se qata nazar misprediction rate kya converge karti hai?
Lagbhag 50% — koi bhi predictor coin-flip data ko beat nahi kar sakta, isliye extra history bits ya perceptrons help nahi kar sakte, aur yahi woh case hai jahan stalling win kar sakta hai.
Jab do nested speculations in-flight hain aur outer branch mispredict kare toh kya hota hai?
Outer branch ke baad ki sab cheezein — inner speculation aur uski ROB entries sameti — saath mein squash ho jaati hain, kyunki poora path galat ground par tha.
Recall Yahan har trap ki ek-line summary
Speculation hidden state ko turant touch karti hai lekin official state sirf commit par — har trap koi na koi jagah hai jahan log "hardware ne ise run kiya" aur "program ne ise dekha" ko confuse kar dete hain.