๐Ÿ“–โœ๏ธ(ใƒป∀ใƒป)

๊ฒ€์ƒ‰๊ฒฐ๊ณผ 7 ๊ฐœ
์Šค๋ ˆ๋“œ ๋ฐœ์‚ฐ (thread divergence)

divergence๋Š” ๋ฐœ์‚ฐ, ๋ถ„๊ธฐ๋ผ๋Š” ๋œป์„ ๊ฐ€์ง„ ์˜์–ด ๋‹จ์–ด์ด๋‹ค. ๋‘˜ ์ด์ƒ์˜ ๋‹น์‚ฌ์ž ๊ฐ„์˜ ์˜๊ฒฌ, ๊ด€์‹ฌ ๋˜๋Š” ํฌ๋ง ์‚ฌํ•ญ์˜ ์ฐจ์ด ๋˜๋Š” ๊ณตํ†ต์ ์—์„œ ๋ฒ—์–ด๋‚˜๋Š” ๊ณผ์ •์„ ์˜๋ฏธํ•œ๋‹ค๊ณ  ํ•œ๋‹ค. ์Šค๋ ˆ๋“œ ๋ฐœ์‚ฐ(thread divergence)์€ GPU ๋‚ด์—์„œ ์ค‘์š”ํ•œ ๊ฐœ๋…์œผ๋กœ, GPU๋Š” ๋งŽ์€ ์ˆ˜์˜ ์‰์ด๋” ์ฝ”์–ด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๊ณ  ์ด ์ฝ”์–ด๋“ค์€ ๋ณ‘๋ ฌ๋กœ ๋™์‹œ์— ๋งŽ์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ตฌ์กฐ๋กœ ๋˜์–ด์žˆ๋‹ค. ์Šค๋ ˆ๋“œ ๋ฐœ์‚ฐ์ด ๋ฐœ์ƒํ•˜๋ฉด ์ด ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ์˜ ํšจ์œจ์„ฑ์ด ํฌ๊ฒŒ ๋–จ์–ด์ง€๊ฒŒ ๋˜๋Š”๋ฐ.... (;๏ผพโ—‡๏ผพ;)ใ‚ ์Šค๋ ˆ๋“œ ๋ฐœ์‚ฐ(thread divergence) ์ด๋ž€? ์Šค๋ ˆ๋“œ ๋ฐœ์‚ฐ์€ GPU๋‚ด์—์„œ ์‹คํ–‰๋˜๋Š” ์—ฌ๋Ÿฌ ์‰์ด๋” ์ฝ”์–ด(์Šค๋ ˆ๋“œ)๊ฐ€ ๋™์ผํ•œ ์‹œ์ ์— ์„œ๋กœ ๋‹ค๋ฅธ ์‹คํ–‰ ๊ฒฝ๋กœ๋ฅผ ๋”ฐ๋ผ๊ฐ€๊ฒŒ ๋  ๋•Œ ๋ฐœ์ƒํ•œ๋‹ค. ์ด๋Š” ์ฃผ๋กœ ์กฐ๊ฑด๋ฌธ('if', 'switch' ๋“ฑ) ์‚ฌ์šฉ์— ์˜ํ•ด ๋ฐœ์ƒํ•˜..

SIMD๋ž€? (Single Instruction Multiple Data)

SIMD SIMD๋Š” Single Instruction, Multiple Data์˜ ์•ฝ์ž๋กœ, ํ•˜๋‚˜์˜ ๋ช…๋ น์–ด๋กœ ์—ฌ๋Ÿฌ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ์—ฐ์‚ฐ์„ ๋™์‹œ์— ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ ๊ธฐ์ˆ ์ด๋‹ค. ์ด ๊ธฐ์ˆ ์€ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ‘๋ ฌ๋กœ ์ฒ˜๋ฆฌํ•จ์œผ๋กœ์จ ์„ฑ๋Šฅ์„ ํฌ๊ฒŒ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋ฒกํ„ฐ๋‚˜ ํ–‰๋ ฌ ๊ฐ™์€ ๋Œ€๋Ÿ‰์˜ ๋ฐ์ดํ„ฐ์— ๊ฐ™์€ ์—ฐ์‚ฐ(๋”ํ•˜๊ธฐ, ๊ณฑํ•˜๊ธฐ ๋“ฑ)์„ ๋ฐ˜๋ณต์ ์œผ๋กœ ์ ์šฉํ•ด์•ผํ•  ๋•Œ, SIMD๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ด๋Ÿฌํ•œ ์—ฐ์‚ฐ์„ ํ•œ ๋ฒˆ์— ์—ฌ๋Ÿฌ ๋ฐ์ดํ„ฐ ๋‹จ์œ„๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์–ด์„œ ์ฒ˜๋ฆฌ ์†๋„๊ฐ€ ๋งค์šฐ ๋นจ๋ผ์ง„๋‹ค. ์ปดํ“จํ„ฐ์˜ CPU๋‚˜ GPU์—์„œ ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ๊ณ , ํŠนํžˆ ๊ทธ๋ž˜ํ”ฝ ์ฒ˜๋ฆฌ, ๊ณผํ•™ ๊ธฐ์ˆ  ๊ณ„์‚ฐ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ฒ€์ƒ‰, ๋Œ€๊ทœ๋ชจ ์ˆซ์ž ์—ฐ์‚ฐ ์ฒ˜๋ฆฌ ๋“ฑ ๋‹ค์–‘ํ•œ ๋ถ„์•ผ์—์„œ ํšจ์œจ์„ฑ์„ ๋ฐœํœ˜ํ•œ๋‹ค. C๋‚˜ C++์—์„œ๋Š” SIMD๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ํŠน์ •ํ•œ ์ปดํŒŒ์ผ๋Ÿฌ ํ™•์žฅ(ex. SS..

Mac VSCode-๋‹ท๋„ท sdk ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ (The .NET Core SDK cannot be located)

์—ด์‹ฌํžˆ ๋‹ค์šด๋ฐ›๊ณ  ์—ฐ๊ฒฐํ•˜๊ณ  ํ–ˆ๋Š”๋ฐ ์ž๊พธ ์•„๋ž˜ ์‚ฌ์ง„๊ณผ ๊ฐ™์€ ๊ฒฝ๊ณ ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค. ์•„๋ฌด๋ž˜๋„ ์ด์ชฝ์€ ์ ‘ํ•  ๊ธฐํšŒ๊ฐ€ ๋ณ„๋กœ ์—†์—ˆ๋‹ค ๋ณด๋‹ˆ ํ•˜๋‚˜๋ฅผ ํ•˜๋ฉด ์•ˆ๋˜๋Š” ๊ฒŒ ๋‹ค์„ฏ๊ฐœ๊ฐ€ ์ƒ๊ธด๋‹ค ๋Œ€ํ•™๊ต 1ํ•™๋…„ ๋•Œ๋กœ ๋‹ค์‹œ ๋Œ์•„๊ฐ„ ๊ธฐ๋ถ„ ๐Ÿคค dotnet --list-sdks ๋‹ค์šด๋ฐ›๊ณ  ๋œ ์ค„ ์•Œ์•˜๋Š”๋ฐ ํ„ฐ๋ฏธ๋„ ์ฐฝ์—์„œ dotnet ์„ค์น˜๋ฅผ ํ™•์ธํ•˜๋ ค๊ณ  ํ•ด๋„ ์„ค์น˜๊ฐ€ ์•ˆ๋˜์—ˆ๋‹ค. ์ฐพ์„ ์ˆ˜ ์—†๋‹ค๋Š” ๋กœ๊ทธ๋งŒ ๋‚˜์™”๋‹ค. ๊ทธ๋ƒฅ ๋‹ค์‹œ ๊ป๋‹คํ‚ค๋ฉด ๋œ๋‹ค๋Š” ์‚ฌ๋žŒ๋„ ์žˆ์—ˆ๋Š”๋ฐ ๊ป๋‹ค์ผœ๊ณ  ์žฌ์„ค์น˜ํ•ด๋ด๋„ ๊ทธ๋Œ€๋กœ์˜€๋‹ค. ์ด๊ฒƒ์ €๊ฒƒ ํ•ด๋ณด๊ณ  ๋‹นํ™ฉํ•˜๋‹ค๊ฐ€ ์—ฌ๋Ÿฌ ๊นจ๋‹ฌ์Œ์„ ์–ป์—ˆ๊ณ , ์Šคํƒ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ์˜ ํ•œ ์™ธ๊ตญ์ธ์˜ ๋„์›€์œผ๋กœ ์„ฑ๊ณตํ–ˆ๋‹ค. VSCode ๋ฅผ ์ข…๋ฃŒ ํ•œ ํ›„ ํ„ฐ๋ฏธ๋„ ์ฐฝ์„ ์—ฐ๋‹ค. vi ~/.zshrc ๋ฅผ ์ž…๋ ฅํ•ด i (์ˆ˜์ • ๋ชจ๋“œ)๋ฅผ ๋ˆ„๋ฅด๊ณ  ์•„๋ž˜์™€ ๊ฐ™์ด path๋ฅผ ์ ์–ด์ค€๋‹ค. (๊ฒฝ๋กœ๋ฅผ ํ™•์ธํ•˜๋Š” ๋ฐฉ๋ฒ•) shift..

[C,C++] QueryPerformanceCounter / ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ ์‹œ๊ฐ„ ์ธก์ •

์ปดํ“จํ„ฐ ๋ฉ”์ธ๋ณด๋“œ์˜ ๊ณ ํ•ด์ƒ๋„ ํƒ€์ด๋จธ๋ฅผ ์ด์šฉํ•ด ์‹œ๊ฐ„ ๊ฐ„๊ฒฉ์„ ์ธก์ •ํ•œ๋‹ค. ํ˜„์žฌ ์‹คํ–‰ ์†๋„๋ฅผ ์ธก์ •ํ•˜๊ณ  ์‹ถ์œผ๋ฉด QueryPerformanceCounter(=QPC)๋ฅผ ์ด์šฉํ•˜๋ฉด ๋œ๋‹ค. ํ•˜์ง€๋งŒ QPC๋Š” ์™ธ๋ถ€ ์‹œ๊ฐ„ ์ฐธ์กฐ์™€ ๋…๋ฆฝ์ ์ด๋ฉฐ ๋™๊ธฐํ™”๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ ํ˜„์žฌ ์‹œ๊ฐ„๊ฐ’์„ ๊ตฌํ•˜๊ณ  ์‹ถ์œผ๋ฉด GetSystemTimePreciseAsFildTime์„ ์ด์šฉํ•˜๋ผ๊ณ  MSDN์— ๋‚˜์™€์žˆ๋‹ค. QueryPerformanceFrequency์™€ QueryPerformanceCounter๋ฅผ ์ด์šฉํ•˜๋ฉด ํƒ€์ด๋จธ, FPS ์ธก์ • ๋“ฑ ์—ฌ๋Ÿฌ ๋ฐฉ๋ฉด์œผ๋กœ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. QueryPerformanceFrequency ์„ฑ๋Šฅ ์นด์šดํ„ฐ์˜ ๋นˆ๋„๋ฅผ ๊ฒ€์ƒ‰ํ•œ๋‹ค. BOOL QueryPerformanceFrequency ( LARGE_INTEGER *lpFrequency ); lpFr..

[๊ฒŒ์ž„์ˆ˜ํ•™] ์Šฌ๋ผ์ด๋”ฉ ๋ฒกํ„ฐ (Sliding Vector)

์Šฌ๋ผ์ด๋”ฉ ๋ฒกํ„ฐ๋Š” ์ถฉ๋Œ ์‹œ์— ์ž…์‚ฌ๋ฒกํ„ฐ๊ฐ€ ์ž…์‚ฌ๋ฉด์„ ๋”ฐ๋ผ์„œ ๋ฏธ๋„๋Ÿฌ์ง€๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ˆ˜ํ‰ ์„ฑ๋ถ„๋งŒ์„ ๋‚จ๊ธด ๋ฒกํ„ฐ์ด๋‹ค. ๊ตฌํ•˜๋Š” ๋ฐฉ๋ฒ•์—๋Š” ๋ฐ˜์‚ฌ๋ฒกํ„ฐ๋ฅผ ์ด์šฉํ•ด ๊ตฌํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ ์ผ๋ฐ˜์ ์ธ ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค. ๋ฐ˜์‚ฌ๋ฒกํ„ฐ ์ด์šฉํ•ด์„œ ๊ตฌํ•˜๊ธฐ ๋ฐ˜์‚ฌ ๋ฒกํ„ฐ์—์„œ ์ž…์‚ฌ๋ฒกํ„ฐ P์— n(-P·n)์„ ํ•œ๋ฒˆ ๋”ํ•ด์ฃผ๋ฉด ์ž…์‚ฌ๋ฉด์— ํˆฌ์˜๋œ ์ ‘์„ ๋ฒกํ„ฐ๋ฅผ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค. ์ž…์‚ฌ๋ฒกํ„ฐ์˜ ์—ญ๋ฒกํ„ฐ -P๊ฐ€ n์— ํˆฌ์˜๋œ n(-P·n)์„ ์ด์šฉํ•ด ์Šฌ๋ผ์ด๋”ฉ ๋ฒกํ„ฐ๋ฅผ ๊ตฌํ•˜๊ณ  ์žˆ๋Š” ์ค‘์ด๋‹ค. ๋”ฐ๋ผ์„œ ๋ฐ˜์‚ฌ ๋ฒกํ„ฐ๋ฅผ ์ด์šฉํ•  ๋•Œ ์Šฌ๋ผ์ด๋”ฉ ๋ฒกํ„ฐ S๋ฅผ ๊ตฌํ•˜๋Š” ๊ณต์‹์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. S = P + n(-P·n) ์ผ๋ฐ˜์ ์ธ ๋ฐฉ๋ฒ• ์ผ๋ฐ˜์ ์ธ ๋ฐฉ๋ฒ•์œผ๋กœ๋Š” ์ž…์‚ฌ๋ฒกํ„ฐ P๋ฅผ n์— ๋ฐ”๋กœ ํˆฌ์˜์‹œํ‚จ๋‹ค. ์ž…์‚ฌ๋ฒกํ„ฐ P์™€ ๋ฒ•์„ ๋ฒกํ„ฐ n์˜ ๋ผ์ธ ๊ฐ์ด 0≤ θ ≤ π/2 ์ผ ๋•Œ, P·n์˜ ๊ฐ’์€ ์Œ์ˆ˜๊ฐ€ ๋˜๋ฏ€๋กœ, n๋ฒกํ„ฐ์˜ ์—ญ๋ฒกํ„ฐ ๋ฐฉํ–ฅ์œผ๋กœ ํˆฌ์˜ ..

[๊ฒŒ์ž„์ˆ˜ํ•™] ๋ฐ˜์‚ฌ๋ฒกํ„ฐ (Reflection Vector)

๋ฐ˜์‚ฌ ๋ฒกํ„ฐ๋Š” ์ •๋ฐ˜์‚ฌ์ด๋‹ค. ์ •๋ฐ˜์‚ฌ๋Š” ์ž…์‚ฌ๊ฐ๊ณผ ๋ฐ˜์‚ฌ๊ฐ์ด ๋™์ผํ•œ ๋ฐ˜์‚ฌ๋ฅผ ์˜๋ฏธํ•œ๋‹ค. ํˆฌ์˜ ๋ฒกํ„ฐ ๋ฐ˜์‚ฌ ๋ฒกํ„ฐ๋ฅผ ๊ตฌํ•˜๋ ค๋ฉด ํˆฌ์˜ ๋ฒกํ„ฐ๋ฅผ ๋จผ์ € ๊ตฌํ•ด์•ผ ํ•œ๋‹ค. ํˆฌ์˜์ด๋ž€ ์–ด๋–ค ๋ฒกํ„ฐ v๋ฅผ ๋‹จ์œ„ ๋ฒกํ„ฐ n์— ๋‚ด์ ํ•˜์—ฌ ๊ตฌํ•  ์ˆ˜ ์žˆ๋Š” v์˜ n๋ฐฉํ–ฅ์œผ๋กœ์˜ ๊ธธ์ด๋ฅผ ๋œปํ•œ๋‹ค. ๋‚ด์ ๊ฐ’์ด ์Šค์นผ๋ผ์ด๋ฏ€๋กœ ํˆฌ์˜๋œ ๋ฐฉํ–ฅ์œผ๋กœ์˜ ๋ฒกํ„ฐ๋ฅผ ๊ตฌํ•˜๋ ค๋ฉด ์ด ๋‚ด์ ๊ฐ’์— ๋ฐฉํ–ฅ๋ฒกํ„ฐ n์„ ๊ณฑํ•ด์ฃผ๋ฉด ๋œ๋‹ค. (v·n)n์„ ์ด์šฉํ•ด ๋ฒกํ„ฐ๋ฅผ ๊ตฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค. * ์™œ ์ด๋ ‡๊ฒŒ ๋˜๋Š”์ง€ ์ถ”๊ฐ€ ์„ค๋ช…! ๋”๋ณด๊ธฐ v์™€ n์„ ๋‚ด์ ํ•˜๋ฉด cosθ๋ฅผ ๊ฒฐ๊ณผ๊ฐ’์œผ๋กœ ์–ป๊ฒŒ ๋œ๋‹ค. v·n = ||v||||n||cosθ ์—ฌ๊ธฐ์„œ ์ด ์‚ผ๊ฐํ˜•์€ ์ง๊ฐ์‚ผ๊ฐํ˜•์ด๋ฏ€๋กœ ์ฝ”์‚ฌ์ธ๊ฐ’์€ ๋ฐ‘๋ณ€/๋น—๋ณ€ ์ฆ‰, ||n|| / ||v|| ์ด๋‹ค. ||n|| = ||v||cosθ ์ด๊ณ  ํˆฌ์˜ํ•œ ๊ธธ์ด๋ฅผ w๋ผ๊ณ  ํ–ˆ์„ ๋•Œ w = ||v||cosθ๊ฐ€ ๋œ..