Visual walkthrough — Memory hierarchy (global, shared, registers)
6.2.7 · D2· Hardware › GPU Architecture › Memory hierarchy (global, shared, registers)
Parent note ne punchline bata di thi: hot data ko paas rakho, aur matrix multiply mein ~15× kam global traffic hogi. Yeh page us number ko zero se derive karta hai. Hum assume nahi karenge ki aap jaante hain "thread", "warp", ya "cycle" kya hota hai. Har symbol ko ek picture pe banate hain, step by step, aur memory trips khud count karte hain.
Step 0 — Words jo hum use kar sakte hain
Kisi bhi formula se pehle, teen plain-word ideas, har ek neeche di gayi picture se pinned.
Aur teen storage places, is hisaab se order ki gayi hain ki worker ko kitna door tak pahunchna padta hai:
Ek cycle sirf GPU ke clock ki ek tick hai — hamaari "kitna time lagega" ki unit. Yeh kehna ki global "400 cycles" hai matlab pantry tak ek walk ~400 arithmetic ticks jitna costly hai.

Kya / Kyun / Picture. Kya: humne workers aur shelves ke naam rakhe. Kyun: baad mein aane wala har symbol (, , tiles, transactions) sirf inhi se bana hai. Picture: teen shelves distance ke hisaab se stack ki gayi hain — jitna upar chadhoge, utna lamba arrow (walk). Yeh distance-ladder hi poori wajah hai ki hierarchy exist karti hai.
Step 1 — Problem, pantry ki taraf arrows ki tarah draw ki gayi
Hamaara worked example: do matrices multiply karo, , jahan .
To ek thread pantry se numbers padhta hai — har loop trip mein ek aur ek . Algorithm khud dekhne ke liye Matrix Multiplication Optimization dekhein; yahan hum sirf walks count kar rahe hain.

Kya / Kyun / Picture. Kya: humne 2048 global reads per thread count ki. Kyun: yeh hamaara baseline "walk count" hai — baad mein sab kuch iske against measure hoga. Picture: ek thread 2048 lambe arrows door ke pantry mein fire kar raha hai. Arrows ki yeh wall hi problem hai.
Step 2 — Naïve total, honestly count kiya gaya
Har output cell ke liye ek thread hai, to threads hain (ise "1M" kaho).

Kya / Kyun / Picture. Kya: per-thread walks ko threads ki number se multiply kiya. Kyun: sahi traffic dekhne ke liye, aur waste expose karne ke liye. Picture: ki wohi row (coral mein highlight ki gayi) us row ke har thread dwara fetch ki jaati hai — bilkul same 1024 numbers, baar baar pantry tak le jaaye jaate hain. Yahi repetition hai jo hum aage plug karenge.
Step 3 — Idea: ek baar fetch karo, kaafi baar reuse karo (tiling)
Har matrix ko size ke chhote square tiles mein split karo. Hum use karte hain.

Kya / Kyun / Picture. Kya: shared memory mein parked ek tile introduce ki. Kyun: shared memory global se ~10× closer hai, aur cooperative loading Step 2 ke duplicate walks hata deta hai. Picture: 256 threads (lavender box) har ek ek element pantry se lete hain (lambe arrows), use shared counter par daalte hain, phir compute ke dauran counter se short arrows draw karte hain — ek lambe arrow ke badle kaafi short arrows.
Step 4 — Tiled walks count karo, term by term
Tile ko -dimension ke paar slide karo. Ek row/column ke saath tiles ki number:
ke saath:

Kya / Kyun / Picture. Kya: sharing ke saath total walks dobara count ki. Kyun: honest new number paane ke liye. Picture: ek loaded -tile row (mint) alag output cells feed karti hai — ek walk, solah uses.
Step 5 — Speedup, aur kahan se aata hai
Parent ka "~15×" yahi number hai, practice mein edge/boundary tiles load karne se thoda smooth ho jaata hai. Clean law yeh hai: har fetched value ko times reuse karo → traffic se drop hoti hai. Yeh Roofline Model aur Memory Bandwidth Optimization ke peeche arithmetic-intensity lever hai.

Kya / Kyun / Picture. Kya: dono counts divide ki. Kyun: yeh isolate karne ke liye ki speedup kya cause karta hai — woh hai, aur kuch nahi. Picture: ek bar chart, 2.15B se 134M tak shrink ho raha hai, factor se gap label kiya gaya hai.
Step 6 — Edge case: shared counter mein 32 lanes hain (bank conflicts)
Humne assume kiya tha ki shared memory uniformly fast hai. Isme ek catch hai. Shared memory banks mein split hoti hai: 32 lanes, har ek per cycle ek request serve karta hai.
Transpose case trap aur fix dikhata hai: ek shared tile column access tile[i][i] ko har thread ke liye lane par hit karta hai → , ek 32× slowdown. padding karne se har row ek lane shift ho jaati hai, to ek column saare 32 lanes mein spread ho jaata hai → .

Kya / Kyun / Picture. Kya: shared memory ko 32 lanes ki tarah model kiya. Kyun: counter tab hi fast hota hai jab team ek lane mein crowd na kare. Picture: left, ek column lane 0 mein jam gaya (coral, serialized); right, [32][33] padding ke baad wohi column saare lanes mein fan out ho gaya (mint, parallel).
Step 7 — Degenerate cases: jab tiling kaam nahi karta

Kya / Kyun / Picture. Kya: ki boundary values aur no-reuse case sweep kiya. Kyun: contract kehta hai har case dikhana zaroori hai — including tab bhi jab trick fail ho. Picture: -vs-speedup curve, par flat 1 se, upar jaata hai, phir shared-memory limit ke baad ek red "won't fit" wall.
Ek-picture summary

Ek thread ki 2048 far-pantry walks (Step 1) × 1M threads = 2.15 B walks (Step 2, duplicates se bhari). Shared counter par ek tile park karo (Step 3), har fetched value ko baar reuse karo (Step 4), aur total walks tak gir jaati hain — ek clean × win (Step 5) — bas counter ki 32 lanes jam na hon (Step 6) aur tile fit ho real reuse ke saath exploit karne ke liye (Step 7).
Recall Feynman retelling — apne words mein wapas bolo
Ek chef ki imagine karo jo door ke pantry se laata hai. Naïvely, har dish chef ko usi onion ke liye baar baar pantry bhejtii hai — do billion trips, mostly repeats. Fix: ek runner ko bheho ki ingredients ki ek tray le aaye aur shared counter par rakh de; ab sab counter se cook karte hain, pantry mein ek baar per tray jaate hain ek baar per pinch ki jagah. 16 width ki tray ka matlab hai har ingredient ko har fetch mein 16 baar use kiya jaata hai, to trips 16-guna girte hain. Do cautions: counter mein 32 narrow slots hain, aur agar poori team ek slot se pakdti hai to queue mein lag jaate hain (fix: layout ko thoda nudge karo taaki spread ho); aur agar koi recipe har ingredient sirf ek baar use kare, to reuse karne ke liye kuch nahi — tray kisi ke kaam nahi aati.
Reveal-check:
ke liye total naïve reads
ke liye total tiled reads
Traffic-reduction factor barabar hota hai
[32][32] diagonal-column access ke liye bank-conflict serialization
Shared tile ko [32][33] pad kyun karte hain
Related: Memory Latency Hiding · Cache Architecture · GPU Thread Hierarchy · CUDA Memory Types