5.4.7 · D5 · HinglishMemory Hierarchy & Caches
Question bank — Write-allocate vs no-allocate
5.4.7 · D5· Hardware › Memory Hierarchy & Caches › Write-allocate vs no-allocate
Quick vocabulary refresh taaki neeche ki har line zero se bhi padhne layak ho:
True or false — justify
Write-back caches almost always write-allocate ke saath pair hote hain.
True. Write-back writes ko defer karta hai aur unhe Dirty Bit se cache line ke andar track karta hai; agar write miss ने ek line allocate nahi ki, toh dirty data ko hold karne ki koi jagah nahi hoti, jisse immediate memory write force hota — jo ki disguise mein write-through hi hai.
No-allocate sirf write-through ke saath pair ho sakta hai.
Practice mein True. Bina dirty mark karne wali line ke, write ko "wait" karne ki jagah nahi hoti, isliye usse abhi memory mein push karna padta hai — yeh exactly write-through behaviour hai. Dekho Write-back vs Write-through.
Write-allocate hamesha total memory traffic kam karta hai.
False. Yeh traffic tab hi kam karta hai jab fetched block reuse hota hai (dobara read ya write hota hai). One-shot streaming write ke liye, fetch pure wasted bandwidth hai — tum ek block sirf isliye read karte ho taaki usse overwrite kar sako aur phir kabhi use na karo.
No-allocate write par cache mein kabhi koi data nahi laata.
Definition ke hisaab se True — yahi toh poora point hai. Written bytes cache ko "bypass" karke lower level tak jaate hain, isliye baad mein usi block ka read phir bhi miss karega.
64-byte line par ek single write-allocate, ek 1-byte store ke liye bhi poore 64 bytes fetch karta hai.
True. Caches data ko Cache Line Size granularity par manage karte hain, isliye line ko coherent rakhne ke liye aur neighbouring bytes ke future reads serve karne ke liye poora block fetch hota hai.
Write-allocate ke benefits sirf temporal locality se aate hain.
False. Yeh dono ko exploit karta hai: temporal locality (tum wahi byte dobara write/read karte ho) aur spatial locality (baad ke accesses fetched block mein neighbouring bytes par land karte hain jo pehle se hain).
Non-temporal / streaming store instructions write-allocate implement karte hain.
False. Woh precisely no-allocate implement karte hain taaki cache ko bypass karen aur Cache Pollution se bachen — dekho Streaming Stores.
No-allocate choose karna kabhi performance hurt nahi kar sakta.
False. Agar write ke baad jaldi hi koi nearby read hoti hai, toh no-allocate jo hit hoti woh miss mein badal deta hai, jisse full memory read latency ka cost aata hai.
Spot the error
"Write-back + no-allocate ke saath, hum write ko cache line mein hold karte hain aur baad mein flush karte hain."
Error: no-allocate ka matlab hai koi line allocate nahi hoti, isliye hold ya flush karne ke liye koi line hai hi nahi. Write ko memory mein immediately jaana padta hai, jo "flush later" premise ko contradict karta hai.
"Write-allocate missing write par hi faster hai kyunki data cache mein aa jaata hai."
Error: miss par hi write-allocate slower hota hai — use pehle block fetch karna padta hai (read latency) phir write. Payoff sirf baad ke accesses par milta hai.
"No-allocate bandwidth bachata hai kyunki yeh memory ko kabhi touch nahi karta."
Error: no-allocate phir bhi data lower level par likhta hai, isliye yeh memory ko zaroor touch karta hai. Jo cheez yeh bachata hai woh extra read (block fetch) hai jo write-allocate karta.
"Kyunki frame-buffer loop har byte likhta hai, write-allocate theek hai — hum fetched block ko overwrite kar dete hain."
Error: tum overwrite karte ho, haan, lekin tumne pehle usse fetch karne ka cost pay kiya, aur room banane ke liye useful data evict kiya — zero reuse ke saath double waste. No-allocate yahan sahi hai.
"Write-through + write-allocate bekar hai kyunki tum memory mein likhte hi ho."
Error: yeh bekar nahi hai — block allocate karne ka matlab hai future reads us block ke cache mein hit karengi. Write cost unchanged rehta hai, lekin read locality capture hoti hai.
"Write-allocate ke under ek write miss kisi bhi write policy mein dirty bit set karta hai."
Error: Dirty Bit sirf write-back ke under meaningful hai. Write-through ke under data pehle se memory mein hai, isliye kuch bhi "dirty" nahi hota.
Why questions
Write-back ko block cache mein kyun chahiye?
Kyunki write-back ki poori savings isi se aati hain ki ek line dirty mark karo aur memory write defer karo; dirty flag ka matlab sirf ek resident line par hota hai, isliye line exist karni chahiye — isliye write-allocate.
No-allocate cache pollution kyun reduce karta hai?
One-time writes ko kabhi cache line nahi milti, isliye woh us data ko evict nahi kar sakti jo actually reuse hoga — cache ki precious lines hot data ke liye dedicated rehti hain. Dekho Cache Pollution.
Write-allocate ek block par writes ki ek run ko single memory read mein kyun badal deta hai?
Pehla write miss hota hai aur block fetch hota hai; uss same block par har agle write ab hit karta hai, aur write-back ke under eviction tak kuch bhi flush nahi hota — isliye poori run ka cost sirf ek read hota hai.
Streaming writes no-allocate kyun prefer karte hain bhaale baad mein reads miss honge?
Kyunki streaming data ek baar likha jaata hai aur essentially dobara kabhi nahi padha jaata, isliye koi "baad ki read" protect karne ke liye hai hi nahi — allocate karne ke fetch aur eviction costs kuch nahi khareed paate. Write Combining Buffers in writes ko aur batch kar sakta hai.
Decision P(reuse | write) par kyun depend karta hai?
Kyunki write-allocate ka fetch cost tabhi recover hota hai jab block dobara use hota hai; reuse ki probability jitni zyada, utni zyada chance hai ki saved future misses up-front fetch se zyada hon.
No-allocate missing write par lower latency kyun rakh sakta hai?
Yeh block fetch wait kiye bina seedha memory mein likhta hai, isliye store kisi read ke peeche block nahi hota — jabki write-allocate ko read-then-write karna padta hai.
Edge cases
Tum ek aise block par write karte ho jo already cache mein hai (write hit). Kya allocate/no-allocate matter karta hai?
Nahi — dono policies sirf write miss par alag hoti hain. Hit par line pehle se exist karti hai, isliye write allocation policy se regardless usse simply update kar deta hai.
Tum no-allocate + Write Combining Buffers ke saath ek full line ke har byte likhte ho. Koi fetch chahiye?
Conceptually bhi koi fetch nahi chahiye, kyunki poori line overwrite ho rahi hai — combining buffers partial writes ko gather karte hain aur ek full line memory mein push karte hain, read-for-ownership se bachte hain.
Write-allocate ke under, tum 64-byte line ka 1 byte likhte ho. Right baad mein cache state kya hai?
Poora 64-byte block fetch hota hai, woh 1 byte update hota hai, aur (write-back ke under) line valid aur dirty mark hoti hai; baaki 63 bytes apni memory values hold karte hain.
Ek workload ek huge array ek baar likhta hai, phir bahut baad mein usse read karta hai jab woh evict ho chuka ho. Allocate ya nahi?
No-allocate theek hai — jab reads hote hain tab tak block waise bhi evict ho chuka hota, isliye write par allocate karne se sirf write phase mein pollution ke alawa kuch nahi mila.
memset(buf, 0, HUGE) ke turant baad buf ke heavy reads. Allocate ya nahi?
Yahan write-allocate — immediate reuse ka matlab hai initialized blocks hot rehte hain aur reads hit karti hain, isliye allocate cost pay karna worth hai (yeh streaming case ka ulta hai).
Degenerate case: sirf write-through aur no-allocate wali cache. Kya koi line kabhi dirty ho sakti hai?
Nahi — har write seedha memory mein jaata hai aur misses kabhi allocate nahi karte, isliye koi resident line kabhi memory se "aage" nahi hoti; dirty concept simply arise hi nahi hota.
Recall Lock in karne ke liye one-line summary
Jaldi reuse hoga ::: write-allocate prefer karo (fetch pay off karta hai). Ek baar likho, kabhi reuse nahi ::: no-allocate prefer karo (fetch + pollution avoid karo). Write-back ::: write-allocate force karta hai. No-allocate ::: write-through-style immediate writes force karta hai.