6.1.11 · D2 · HinglishParallelism & Multicore

Visual walkthroughVector - SIMD instructions (SSE, AVX, NEON)

2,607 words12 min read↑ Read in English

6.1.11 · D2 · Hardware › Parallelism & Multicore › Vector - SIMD instructions (SSE, AVX, NEON)

Yeh page parent note ka central result — SIMD aapka loop kitna fast bana deta hai? — bilkul zero se rebuild karti hai. Har symbol ko use karne se pehle hum usse earn karenge, aur har step ko ek blueprint figure milti hai jise aap point kar sako.

Agar aapne abhi tak bada idea nahi dekha, toh pehle parent topic padho. Ek sentence jo aapko saath rakhni hai: ek instruction ek saath kaafi saare numbers par kaam karti hai. Neeche sab kuch us sentence ko ek formula mein convert karta hai.


Step 1 — Kaam ko slow tarike se count karo (scalar)

KYA. Ek scalar loop numbers ko ek ek karke touch karta hai. Socho numbers ka ek array ek row mein rakha hai. Machine us row par chalti hai, har step mein exactly ek box handle karti hai.

KYUN. Pehle hume ek fair baseline chahiye: ek-ek karke kaam karne ki honest cost. Bina "slower" ke compare kiye "faster" measure nahi kar sakte.

PICTURE. Neeche, har amber box ek array element hai. Safed arrow ek ek box visit karta hai. Arrow-visits ginlo — wahi hamara workload hai.

Figure — Vector - SIMD instructions (SSE, AVX, NEON)

Cheezein carefully name karte hain:

  • ::: array mein kitne numbers hain (yahan ; hamesha ). Yeh sirf ek count hai — koi unit nahi.
  • ::: ek element mein kitne CPU cycles lagte hain — yeh wahi shared hai ground rules se. Ek box = ticks.

"Boxes ki sankhya" ko "ticks per box" se multiply karo:

scalar loop ka total time (cycles mein) hai. Yahi hamara baseline hai.


Step 2 — Numbers ko ek wide register mein pack karo

KYA. Ek vector register ek single storage slot hai jo kaafi saare numbers side by side hold karne ke liye wide hota hai. Har side-by-side slot ko hum lane bolte hain. Lanes ki sankhya vector width hai.

KYUN. SIMD ka poora trick yahi hai. Ek number per haath ki jagah, CPU ek mutthi mein numbers pakadta hai. Hume abhi define karna hai kyunki speedup poori tarah isi se bana hoga.

PICTURE. Ek lamba cyan register lanes mein split hua, har ek mein ek number. Ek load instruction ek baar mein charon lanes fill kar deti hai.

Figure — Vector - SIMD instructions (SSE, AVX, NEON)
  • ::: vector width — ek register mein ek saath kitne numbers fit hote hain. Yeh hardware par depend karta hai, aapke data par nahi.

Parent note se concrete values, taaki abstract na rahe:

Instruction set Register width Numbers () for 32-bit floats
SSE (128-bit) 128 bits
AVX (256-bit) 256 bits
AVX-512 (512-bit) 512 bits

Yeh seedha data parallelism se jodta hai: same operation, bahut saare independent data items, lanes ke beech koi baat nahi.


Step 3 — Kaam ko fast tarike se count karo (SIMD)

KYA. Ek SIMD instruction poore register ko — saare lanes ko — usi cycles mein process karta hai jo ek scalar op ne liye the (yahi hamara ground-rule assumption tha). Toh single steps ki jagah hum ke groups lete hain.

KYUN. Yahan saving aati hai. Agar har instruction abhi bhi cycles leti hai lekin ab ki jagah boxes clear karti hai, toh hume bahut kam instructions chahiye.

PICTURE. Wahi 8 boxes, lekin ab do groups of four mein bracket kiye gaye hain. Har bracket ek instruction hai.

Figure — Vector - SIMD instructions (SSE, AVX, NEON)

Hume kitne groups chahiye? Boxes ko lanes se divide karo: . Picture mein groups. Toh pehla guess hai:

Lekin whole number nahi ho sakta — aap "aadha instruction" nahi chala sakte. Ise hum agle step mein theek karte hain.


Step 4 — Ceiling: partial groups ka bhi ek poora instruction lagta hai

KYA. Symbol (ceiling) ka matlab hai " ko agla whole number tak round up karo." Toh , lekin aur .

KYUN. Ek register instruction poore register par fire hoti hai chahe sirf ek lane mein real data ho. ke saath das elements ko instructions chahiye: 8 ka ek full group, plus bache hue 2 ke liye ek aur instruction (baaki 6 lanes waste hain lekin phir bhi "saath chal rahe hain").

PICTURE. Das boxes, . Group 1 aur Group 2 full hain; Group 3 sirf half-full hai lekin phir bhi ek poore instruction ka cost hai (iski empty lanes amber mein shaded hain = waste).

Figure — Vector - SIMD instructions (SSE, AVX, NEON)

Toh honest SIMD time hai:

  • ::: actually issue ki gayi vector instructions ki sankhya, kabhi fraction nahi.

Step 5 — Speedup ratio banao

KYA. Speedup define hota hai "purana time naaye time se divide karo." Agar naya tarika aadha time leta hai, (do baar faster).

KYUN. Ratio "kitni baar faster" kehne ka natural tarika hai. Yeh "cycles" unit cancel kar deta hai, ek pure multiplier chhodta hai jise aap "" bol sako.

PICTURE. Do horizontal time-bars scale par khinche: lamba scalar bar, chhote SIMD bar ke upar. literally "chhoti bar lamba bar mein kitni baar fit hoti hai" hai.

Figure — Vector - SIMD instructions (SSE, AVX, NEON)

Dhyaan do ki upar aur neeche ek hi hai — yahi precisely hamara ground rule hai: ek element utna hi cost karta hai chahe woh akela ride kare ya ek lane mein. Toh yeh cancel ho jaate hain:

  • ka gayab hona key insight hai: speedup depend nahi karta ki operation kitni expensive hai — sirf ek lane mein kitne elements share karte hain. (Yeh cancellation sirf tab legal hai jab , jo hold karta hai kyunki matlab real kaam exist karta hai.)

Step 6 — Large-array limit: kyun S → w

KYA. Jab , se bahut bada ho (likha ), ceiling khas matter nahi karti — ek waste partial group haazaron full groups par ek rounding blip hai. Toh .

KYUN. Yeh woh clean headline number deta hai jo log quote karte hain. Hum ceiling drop karte hain kyunki bade data ke liye yeh answer ko bahut saari instructions mein se ek se bhi kam badalta hai.

PICTURE. Ek curve: plot kiya ke against ke liye. Origin ke paas sawtooth karta hai (ceiling effects) phir dashed amber line ki taraf flatten hota hai.

Figure — Vector - SIMD instructions (SSE, AVX, NEON)

MATLAB KYA HAI. Best jo aap hope kar sakte ho woh lanes ki sankhya ke barabar speedup hai: SSE par , AVX par , AVX-512 par . Yahi woh ideal hai jise Loop Vectorization aur Auto-vectorization chase karte hain.


Step 7 — Edge aur degenerate cases

KYA. Formula exact hai aur ke saath har input cover karta hai. Corners chalte hain taaki kuch surprise na kare.

KYUN. Parent note "" ideal ke roop mein quote karta hai lekin reality mein "". Gap poori tarah inn edge cases mein rehta hai. Jo reader sirf dekhe woh real benchmarks se shock ho jaata; hum abhi woh defuse karte hain.

PICTURE. Char mini-panels, ek per case, har ek mein box layout aur uska show hai.

Figure — Vector - SIMD instructions (SSE, AVX, NEON)
  • Case (empty array). Hamara ground rule isse rule out karta hai — koi kaam nahi, koi speedup nahi, undefined hai. Kuch draw karne ko nahi.
  • Case (exactly ek full register). . Full speed, koi waste nahi.
  • Case (lanes se kam elements, jaise ). . Aap phir bhi ek instruction issue karte ho lekin sirf lanes real data carry karti hain — speedup hai, nahi. Tiny arrays ideal tak nahi pahunch sakti.
  • Case (ek single element). . Bilkul koi speedup nahi — SIMD scalar mein degenerate ho jaata hai, aur setup overhead ise slower bana sakta hai.
  • Case "not divisible" (jaise ). , ideal se neeche kyunki doosri instruction mein lanes waste hain (parent note ka remainder problem).

Real speedup par kyun aata hai ki jagah — memory bandwidth, unaligned loads, scalar tails — yeh sab is arithmetic ceiling ke upar practical ceiling hain. Memory bandwidth particularly Cache Optimization se jodti hai: agar data kaafi fast nahi aa sakta, extra lanes idle baithte hain.


Ek-picture summary

KYA. Ek blueprint jo poori chain compress karta hai: boxes ki scalar row, registers mein grouping, do time-bars, aur woh ratio jo cancel hone ke baad bachta hai — par khatam.

KYUN. Taaki poora argument aapke dimaag mein ek single image ki tarah rahe, saat scattered ones ki tarah nahi. Jab baad mein yaad aaye "SIMD times faster kyun hai?", yeh picture replay karni chahiye: same kaam, kam presses, time-per-press cancel, sirf lane-count bachti hai. Poore page ka payload ek nazar mein yahi hai.

Figure — Vector - SIMD instructions (SSE, AVX, NEON)
Recall Feynman retelling

Socho ek row of chocolates jo tumhe wrap karni hai. Unhe ek ek karke wrap karne mein utni hi moves lagengi jitni chocolates hain — yeh hai , jahan ek wrap ka time hai. (Aur kam se kam ek chocolate chahiye, — empty row wrap karna "faster" nahi hai, woh bas kuch nahi hai.)

Ab tumhe ek magic tray milti hai jo ek single press mein chocolates wrap karti hai — aur crucially, ek press utna hi time leta hai jitna ek chocolate haath se wrap karna, kyunki tray apne saare slots ek saath kaam karti hai. Tum ek baar mein load karte ho, toh button sirf baar press karte ho — upar round off karke kyunki half-full tray ko bhi ek poora press chahiye. Yeh hai .

"Kitni baar faster?" bas purana time naaye time ke upar hai. Time-per-press dono mein appear karta hai, toh cancel ho jaata hai — matlab yeh matter nahi karta ki wrapping fast hai ya slow, sirf yeh kita tray mein kitne fit hote hain. Aap ke paas bachta hai .

Agar tumhare paas bahut saari chocolates hain, toh odd leftover tray barely matter karti hai aur answer exactly tray size par settle ho jaata hai, : ek 8-lane tray 8× faster hai. Lekin sirf ek chocolate ke saath, tray tumhe kuch nahi deti (), aur ek leftover handful ke saath wasted tray slots tumhe ideal se neeche kheench dete hain. Yahi gap — plus real-world snags jaise data bahut slowly aana — wahi hai jo shiny "8×" ko practice mein solid "5×" bana deta hai.

Recall Quick self-check

Speedup mein kyun cancel hota hai? ::: Kyunki humne assume kiya tha ki ek vector instruction utne hi cycles leti hai jitne ek scalar instruction (); ratio sirf elements ki count vs. instructions rakhta hai, toh divide ho jaata hai. , ke liye kya hai? ::: . Ideal speedup exactly kyun hai? ::: Kyunki ke saath, , aur . hone par kya hota hai? ::: — koi speedup nahi; SIMD scalar mein collapse ho jaata hai. kyun hona chahiye? ::: ke liye dono times hain aur undefined hai — aap koi kaam nahi karne ko speed up nahi kar sakte.