Visual walkthrough — Streaming multiprocessors (SM)
6.2.2 · D2· Hardware › GPU Architecture › Streaming multiprocessors (SM)
Yeh page SM topic ka central result build karti hai — ek SM ko ek saath itne saare warps ki zaroorat kyun hai, aur "occupancy" kaise measure karti hai ki uske paas enough hain ya nahi — bilkul pictures se. Hum assume karte hain ki aap kuch nahi jaante: na warp kya hota hai, na cycle kya hota hai, na GPU kyun stall karta hai. Har symbol ko use karne se pehle earn kiya gaya hai.
Step 1 — "Cycle" kya hota hai? SM ki dhadkan
KYA HAI. Kisi bhi formula se pehle, humein woh time unit chahiye jisme SM jeeta hai. Cycle ek tick hai SM ki clock ka — time ka sabse chhota hissa jisme hardware kaam ka ek chhota step kar sakta hai.
YEH IDEA PEHLE KYUN. Is page par har cost ("memory 400 cycles leta hai", "scheduler 1 instruction per cycle issue karta hai") cycles mein measure hoti hai. Agar hum tick ko clearly define nahi karte, baad ka koi bhi number kuch matlab nahi rakhta. Hum sab kuch cycles mein measure karte hain kyunki yahi woh ek clock hai jo SM maanta hai.
PICTURE. Neeche, time left se right ki taraf equal ticks mein chalta hai. Har tick par SM ek instruction start kar sakta hai. Yeh hamara ruler hai.

Step 2 — Ek thread, aur kyun ek akela thread machine ko barbaad karta hai
KYA HAI. Ek thread aapke program ki ek running copy hai — ek worker jo ek recipe follow karta hai. Yeh compute karta hai, aur kabhi kabhi ise global memory (chip ke baaju mein waali badi, door waali DRAM) se ek value chahiye hoti hai.
KYUN. Hum ek thread se shuru karte hain taaki problem ko uske purest form mein dekh sakein. Jab ek thread global memory se koi number maangta hai, toh jawab is cycle mein nahi aata — woh ek lambi delay ke baad aata hai jise hum latency kehte hain, jise likhte hain.
PICTURE. Ek thread ek load issue karta hai, phir stall karta hai — woh cycles tak bilkul frozen hokar kuch nahi karta kyunki woh literally us number ke bina aage nahi badh sakta jo usne maanga tha. Har red tick ek barbaad dhadkan hai.

Red stripe dekho: cycles ke load ke liye, SM 1 cycle kaam karta hai aur 8 cycles kuch nahi karta. Yahi woh disaster hai jo hume fix karna hai.
Step 3 — Ek warp: 32 threads ek instruction se jode hue
KYA HAI. Threads ko ek ek karke schedule nahi kiya jaata. Hardware 32 threads ko ek unit mein bandh karta hai jise warp kehte hain. Warp scheduler ek instruction issue karta hai aur warp ke saare 32 threads use saath mein run karte hain — yeh SIMT hai (Single Instruction, Multiple Threads).
32 KYUN, AUR BUNDLE KYUN. Bundle karne se ek instruction-fetch 32 lanes of arithmetic (CUDA cores) ko drive kar sakti hai, toh aap ek baar control cost dete hain 32 workers ke liye. 32 ki sankhya fixed hardware hai. Timing ke liye, key fact yeh hai: ek warp ek unit ke roop mein stall karta hai — agar warp ek load karta hai, toh saare 32 threads saath mein wahi cycles wait karte hain. Toh latency-hiding math ke liye, ek warp bilkul Step 2 ke ek stalled worker ki tarah behave karta hai.
PICTURE. 32 lanes, inhe saari feed karne wala ek instruction pointer. Jab warp load karta hai, 32 ka poora block saath mein red ho jaata hai.

Kyunki ek warp ek unit ke roop mein stall karta hai, ab se hamari "job" ki unit warp hai, thread nahi.
Step 4 — Thread-blocks: warps ko kaise group kiya jaata hai aur SM ko deliver kiya jaata hai
KYA HAI. Aap GPU ko loose warps nahi dete — aap use thread-blocks dete hain. Ek thread-block threads ka ek batch hai (1024 tak) jise hardware ek SM ko assign karta hai aur wahan se shuru se ant tak run karta hai (koi migration nahi). Kyunki ek warp 32 threads ka hota hai (Step 3), threads ka ek block automatically kaata jaata hai
- — ek block kitne warps banta hai.
- — block size jo aap kernel launch karte waqt choose karte ho.
- — Step 3 se fixed warp width.
BLOCK KO ABHI INTRODUCE KYUN KAREIN. Agle steps mein counting "SM par kitne warps resident hain" ke baare mein baat karti hai. Warps sirf block-sized bundles mein aate hain, toh warps count karne se pehle humein bundle jaanna chahiye. 256-thread block, for example, warps hai — aur SM apne warp crowd build karne ke liye kai aise blocks ek saath stack karta hai.
PICTURE. Ek block = 8 warps ka ek stack; SM kai blocks ek saath rakhta hai, jo warp pool banata hai jisse scheduler draw karta hai.

Step 5 — Trick: jab ek wait kare, doosre warp par switch karo
KYA HAI. Yahan GPU ka poora idea hai. Jab warp 0 apne load par stall karta hai, scheduler idle nahi baithta — woh instantly warp 1 par switch kar leta hai, uski instruction issue karta hai, phir warp 2, aur aise aage. Warp switching free hai (koi saving/restoring nahi — har warp ki state register file mein permanently rehti hai jab tak woh resident hai).
KYUN. Ise latency hiding kehte hain. Hum warp 0 ka wait doosre warps ke useful work ke peeche hide karte hain.
Hume switching rate ke baare mein precise rehna hai, kyunki yahan do alag "per cycle" quantities hain. Maano
- — SM mein independent warp schedulers ki sankhya (real SMs mein 2–4 hote hain).
- — ek scheduler ek cycle mein kitni instructions issue karta hai (usually 1; "dual-issue" mein 2 hoti hai).
- — product: poore SM mein har cycle kitne warps aage badhte hain. warp-issues per cycle count karta hai, ek warp ke andar instructions nahi. Ek scheduler ek baar issue kare toh : exactly ek warp har cycle aage badhta hai. Note karein letter (lower-case, "rate") hamari per-cycle warp rate hai; ise se confuse mat karein jo Step 7 mein introduce hoga, jo registers per thread hai — ek bilkul alag quantity jo bas ittefaq se ek hi letter share karti hai.
PICTURE. Timeline dekho: jab warp 0 ki red wait upar chalta hai, warp 1, 2, 3, … har ek ko neeche ek orange tick milta hai. Wait ab barbaad nahi ho rahi — yeh paros waale warps se cover ho rahi hai.

Step 6 — Exactly kitne warps chahiye, yeh count karna
KYA HAI. Ab derivation. Hamare paas hai:
- cycles ki stall (Step 2),
- ek scheduler machinery jo warps per cycle advance karti hai (Step 5).
KYUN YEH ARITHMETIC. Hum chahte hain ki warp 0 ka data tab tak waapas aa jaaye jab tak hum baaki saare ready warps mein ek baar cycle kar lein, taaki hum kaam se baahar na ho jaayein. Agar har cycle warps advance karti hai aur hole cycles wide hai, toh us hole ke dauran flight mein rakhne waale distinct warps ki sankhya — aur isliye use fill karne ke liye jo sankhya chahiye — hai:
- — resident, ready warps ki sankhya jo humein SM par rakhni hai.
- — stall ki lambaai cycles mein (fill karne wala hole), Step 2 se.
- — warp-issues advanced per cycle, Step 5 se. Ek scheduler ke saath, aur .
- — ceiling (agle poore number tak upar round karo). Round up kyun, down kyun nahi? Kyunki aapke paas warp ka fraction nahi ho sakta, aur agar, say, hota, toh warps hole ka -cycle sliver uncovered chod dete — SM phir bhi stall karta. Upar tak round karna guarantee karta hai ki hole puri tarah tile ho jaaye. "Mujhe safe rehne ke liye kitne chahiye" count ke liye hamesha ceiling.
PICTURE. lambaai ka ek bar jo hume warp slots se tile karna hai. Kam warps → ant mein idle cycles ka ek gap (SM stalls). Bilkul enough → tiles warp 0 ke return tak bina gap ke pahunch jaate hain.

PICTURE. lambaai ka ek bar jo hume warp slots se tile karna hai. Kam warps → ant mein idle cycles ka ek gap (SM stalls). Bilkul enough → tiles warp 0 ke return tak bina gap ke pahunch jaate hain.
Step 7 — Limit: SM cap karta hai ki kitne warps resident ho sakte hain
KYA HAI. Hum chahenge ki ho. Lekin ek SM sirf utne warps hold kar sakta hai ek saath — ise hardware ceiling ==== kahein (real GPUs par typically 48–64). Aap physically isse exceed nahi kar sakte, aur teen alag resources mein se har ek actual limit ko se neeche kheench sakta hai.
TEEN LIMITS KYUN. Har resident warp registers consume karta hai, uska block shared memory aur ek block slot consume karta hai. Jo pehle khatam ho woh decide karta hai ki kitne warps fit hote hain. Toh real resident count teen ceilings ka minimum hai:
PICTURE. Register file warp-sized wedges mein kaata gaya — mote threads (har ek ke paas bahut registers) → kam warps fit; patale threads → bahut warps fit.


Upar ki figure teen ceilings ko teen bars ke roop mein dikhati hai; sabse chhota bar woh hai jo actually aapko limit karta hai.
Step 8 — Warp divergence: har lane useful work nahi karta
KYA HAI. Ab tak hum assume kar rahe the ki warp ke saare 32 threads hamesha saath useful work karte hain. Lekin ek warp saare 32 lanes ke liye ek instruction run karta hai (Step 3). Agar threads ek if/else par alag branches lete hain, toh hardware ko dono paths ek ke baad ek run karne honge, un lanes ko switch off (mask) karte hue jo current path se belong nahi karte.
KYUN YAHAN MATTER KARTA HAI. Har masked path ke dauran, kuch lanes idle baithte hain — woh warp ka issue slot occupy karte hain lekin kuch produce nahi karte. Yeh warp divergence hai. Yeh kitne warps resident hain yeh nahi badalta, lekin yeh per issue effective work ko lower karta hai: ek warp jo sirf half-active hai phir bhi ek poora issue slot cost karta hai, toh aapka real throughput — aur occupancy se milne wala faayda — girata hai.
PICTURE. Ek warp if (threadIdx < 16) se split: pehle low 16 lanes path A run karte hain (top 16 masked, greyed out), phir high 16 lanes path B run karte hain (low 16 masked). Do issue slots spend, har ek mein sirf 16 lanes live.

Step 9 — Occupancy: woh score jo sab kuch jodata hai
KYA HAI. Ab hum woh single number define karte hain jiske around poora topic revolve karta hai.
KYUN YEH THE METRIC HAI. Steps 6–7 ne tension dikhaya: latency hiding chahti hai bahut warps (), lekin hardware unhe par cap karta hai, aur aapke kernel ki register/shared-memory/block appetite ko us cap se bhi neeche rakh sakti hai. Occupancy exactly hai "SM ki latency-hiding capacity ka aap actually kitna fraction use kar rahe ho?"
PICTURE. Ek gauge: SM ke slots, kuch filled (active), kuch empty (wasted). Needle occupancy hai.

Ek-picture summary
Yeh final figure Steps 1→9 ko ek diagram mein compress karta hai: cycle ruler (Step 1), ke liye ek warp stalling (Steps 2–3), blocks warps deliver karte hue (Step 4), scheduler rate par hole fill karta hua (Step 5), count (Step 6), teen ceilings cap karte hue (Step 7), divergence lanes waste karta hua (Step 8), aur occupancy gauge jo sab kuch score karta hai (Step 9).

Recall Feynman retelling — plain words mein wapas bolein
SM ki clock tick karti hai; har tick ek cycle hai. Ek thread kaam karta hai, phir slow door waali memory se ek number maangta hai aur saikdon cycles tak wait karte hue freeze ho jaata hai. Threads 32 ke bundles mein glue hote hain jise warps kehte hain, aur warps SM par thread-blocks ke andar aate hain — 256 threads ka ek block 8 warps hai, aur SM ready warps ki crowd build karne ke liye kai blocks stack karta hai. Scheduler ki trick: jab ek warp frozen hai, ek alag ready warp advance karo — saare schedulers mein har cycle mein unhe. cycles wide hole fill karne ke liye aapko lagbhag ready warps chahiye, upar round kiya taaki hole ka koi bhi sliver uncovered na rahe (kam agar har warp kai loads flight mein rakhta hai, jo MLP hai). Lekin SM sirf itne warps hold kar sakta hai — registers, shared memory, aur block slots sab isse cap karte hain, aur sabse tight wala jeetta hai; woh surviving count hai, bilkul wahi number jo occupancy formula kehta hai. Occupancy fraction hai "warps jo actually paas hain ÷ warps jo SM hold kar sakta tha." Bahut chhota crowd aur woh memory answer aane se pehle khatam ho jaata hai, toh SM idle baithta hai. Aur ek full crowd bhi kaam barbaad kar sakta hai: agar ek warp mein threads alag branch karte hain (divergence), toh warp dono paths half lanes switched off ke saath run karta hai, toh occupancy akele kabhi full throughput guarantee nahi karta. Lekin agar aapka kernel rarely memory par wait karta hai, toh aapko badi crowd ki zaroorat nahi — toh occupancy ek tool hai, trophy nahi.
Recall Quick self-check
Ek cycle hai ::: SM clock ki ek tick — woh unit jisme saari latencies measure hoti hain. Ek warp hai ::: 32 threads jo ek instruction saath execute karte hain aur saath stall karte hain (SIMT). Ek thread-block hai ::: ek SM ko assign kiye gaye 1024 threads tak ka ek batch; yeh warps mein split hota hai. mein ka matlab hai ::: saare schedulers mein har cycle warp-issues advanced (), ek warp ke andar instructions nahi, aur registers per thread bhi nahi. ka matlab hai ::: registers per thread (register ceiling mein use kiya gaya) — rate se ek alag quantity. mein ceiling (round up) kyun? ::: aapke paas warp ka fraction nahi ho sakta, aur round down karne se stall ka ek sliver uncovered rehta, toh SM phir bhi stall karta. denote karta hai ::: warps jo SM par abhi actually resident banaye hain — wahi number jo occupancy formula kehta hai. Ek scheduler aur ek load per warp ke saath ek -cycle stall hide karne ke liye aapko lagbhag chahiye ::: resident warps. Warp divergence hai ::: ek warp mein threads alag branches lete hain, toh warp dono paths serially kuch lanes masked off ke saath run karta hai — issue slots waste karta hai. Lane efficiency hai ::: average active lanes per issue ÷ 32; 1 se neeche matlab occupancy real throughput overstate karti hai. Occupancy equals ::: active warps ÷ max warps jo SM hold kar sakta hai. Resident warps par teen resource ceilings hain ::: registers, shared memory, aur block slots — sabse tight wala jeetta hai. Har warp ke liye kai loads flight mein rakhna (MLP) matlab hai ::: kam warps chahiye, .
Yeh bhi dekho: Thread-blocks · GPU-memory-hierarchy · Tensor-cores · CUDA-cores · Warp-scheduling