๐Ÿง  Accelerator

CUDA ์ƒ์„ธ

๊ฐœ์š”

CUDA(Compute Unified Device Architecture)๋Š” NVIDIA๊ฐ€ 2007๋…„์— ๋„์ž…ํ•œ ๋ณ‘๋ ฌ ์ปดํ“จํŒ… ํ”Œ๋žซํผ์ด์ž ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ชจ๋ธ๋กœ, GPU์˜ ๋ฒ”์šฉ ์—ฐ์‚ฐ ์ž์›์„ C/C++ ๊ธฐ๋ฐ˜ ์ฝ”๋“œ์™€ ์ „์šฉ ๋Ÿฐํƒ€์ž„์œผ๋กœ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค. ๊ฐœ๋ฐœ์ž๋Š” ๊ฐ™์€ ํ”„๋กœ๊ทธ๋žจ ์•ˆ์—์„œ ํ˜ธ์ŠคํŠธ CPU ์ฝ”๋“œ์™€ ๋””๋ฐ”์ด์Šค GPU ์ปค๋„์„ ํ•จ๊ป˜ ์ž‘์„ฑํ•˜๋ฉฐ, AI ํ›ˆ๋ จ/์ถ”๋ก , ๊ณผํ•™ ๊ณ„์‚ฐ, ๋ฐ์ดํ„ฐ ๋ถ„์„, ๋ฏธ๋””์–ด ์ฒ˜๋ฆฌ์ฒ˜๋Ÿผ ๋ฐ์ดํ„ฐ ๋ณ‘๋ ฌ์„ฑ์ด ํฐ ์ž‘์—…์„ GPU๋กœ ์˜คํ”„๋กœ๋”ฉํ•  ์ˆ˜ ์žˆ๋‹ค.

CUDA์˜ ํ•ต์‹ฌ์€ GPU ํ•˜๋“œ์›จ์–ด ๊ตฌ์กฐ๋ฅผ ์†Œํ”„ํŠธ์›จ์–ด ๊ณ„์ธต์œผ๋กœ ๋…ธ์ถœํ•œ๋‹ค๋Š” ์ ์ด๋‹ค. NVIDIA GPU๋Š” ๋‹ค์ˆ˜์˜ ์ŠคํŠธ๋ฆฌ๋ฐ ๋ฉ€ํ‹ฐํ”„๋กœ์„ธ์„œ(SM)๋กœ ๊ตฌ์„ฑ๋˜๊ณ , ๊ฐ SM์€ ์›Œํ”„ ์Šค์ผ€์ค„๋Ÿฌ, ๋ ˆ์ง€์Šคํ„ฐ ํŒŒ์ผ, ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ, ์—ฐ์‚ฐ ์œ ๋‹›์„ ๋ฐ”ํƒ•์œผ๋กœ ๋งŽ์€ ์Šค๋ ˆ๋“œ๋ฅผ ๋™์‹œ์— ์ฒ˜๋ฆฌํ•œ๋‹ค. CUDA๋Š” ์ด๋ฅผ ์Šค๋ ˆ๋“œ, ์Šค๋ ˆ๋“œ ๋ธ”๋ก, ๊ทธ๋ฆฌ๋“œ, ์›Œํ”„, ์ŠคํŠธ๋ฆผ ๊ฐ™์€ ์ถ”์ƒํ™”๋กœ ์ œ๊ณตํ•ด ๊ฐœ๋ฐœ์ž๊ฐ€ ํ•˜๋“œ์›จ์–ด ์„ธ๋ถ€ ๊ตฌ์กฐ๋ฅผ ์ดํ•ดํ•˜๋ฉด์„œ๋„ ์ด์‹ ๊ฐ€๋Šฅํ•œ ๋ณ‘๋ ฌ ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜๊ฒŒ ๋•๋Š”๋‹ค.

ํ•ต์‹ฌ ๊ฐœ๋…

CUDA ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ชจ๋ธ

CUDA ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ชจ๋ธ

CUDA ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ชจ๋ธ์€ ๊ณ„์ธต์ ์ธ ์Šค๋ ˆ๋“œ ์กฐ์ง๊ณผ ๋ฉ”๋ชจ๋ฆฌ ์ ‘๊ทผ ๋ฐฉ๋ฒ•์„ ์ •์˜ํ•œ๋‹ค.

์Šค๋ ˆ๋“œ ๊ณ„์ธต ๊ตฌ์กฐ:
- ์Šค๋ ˆ๋“œ(Thread): ๊ฐ€์žฅ ์ž‘์€ ์‹คํ–‰ ๋‹จ์œ„. ๊ฐ ์Šค๋ ˆ๋“œ๋Š” ๋…๋ฆฝ์ ์ธ ํ”„๋กœ๊ทธ๋žจ ์นด์šดํ„ฐ, ๋ ˆ์ง€์Šคํ„ฐ ์ƒํƒœ, ์Šค๋ ˆ๋“œ ์ธ๋ฑ์Šค๋ฅผ ๊ฐ€์ง„๋‹ค.
- ์Šค๋ ˆ๋“œ ๋ธ”๋ก(Thread Block): ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ๊ฐ€ ๋ฌถ์ธ ํ˜‘์—… ๋‹จ์œ„. ๊ฐ™์€ ๋ธ”๋ก ์•ˆ์˜ ์Šค๋ ˆ๋“œ๋Š” __shared__ ๋ฉ”๋ชจ๋ฆฌ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๊ตํ™˜ํ•˜๊ณ  __syncthreads()๋กœ ๋™๊ธฐํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค.
- ๊ทธ๋ฆฌ๋“œ(Grid): ํ•˜๋‚˜์˜ ์ปค๋„ ์‹คํ–‰์—์„œ ์ƒ์„ฑ๋˜๋Š” ์ „์ฒด ๋ธ”๋ก ์ง‘ํ•ฉ. ๋ธ”๋ก ๊ฐ„ ์‹คํ–‰ ์ˆœ์„œ๋Š” ๋ณด์žฅ๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ ๋ธ”๋ก ๊ฐ„ ์ง์ ‘ ๋™๊ธฐํ™” ์—†์ด ๋™์ž‘ํ•˜๋„๋ก ์„ค๊ณ„ํ•ด์•ผ ํ•œ๋‹ค.

์›Œํ”„(Warp):
- 32๊ฐœ ์Šค๋ ˆ๋“œ๊ฐ€ ์ด๋ฃจ๋Š” ๊ธฐ๋ณธ ์Šค์ผ€์ค„๋ง ๋‹จ์œ„
- ํ•˜๋“œ์›จ์–ด๋Š” ๊ฐ™์€ ์›Œํ”„์˜ ์Šค๋ ˆ๋“œ๋“ค์„ SIMT(Single Instruction, Multiple Thread) ๋ฐฉ์‹์œผ๋กœ ์‹คํ–‰ํ•œ๋‹ค.
- ์›Œํ”„ ๋‚ด๋ถ€์—์„œ ๋ถ„๊ธฐ ๊ฒฝ๋กœ๊ฐ€ ๊ฐˆ๋ผ์ง€๋ฉด ๊ฐ™์€ ์›Œํ”„๊ฐ€ ์—ฌ๋Ÿฌ ๊ฒฝ๋กœ๋ฅผ ์ˆœ์ฐจ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋ฏ€๋กœ ์ฒ˜๋ฆฌ ํšจ์œจ์ด ๋‚ฎ์•„์งˆ ์ˆ˜ ์žˆ๋‹ค.

์ปค๋„(Kernel):
- GPU์—์„œ ์‹คํ–‰๋˜๋Š” ํ•จ์ˆ˜. __global__ ํ‚ค์›Œ๋“œ๋กœ ์„ ์–ธ
- ํ˜ธ์ŠคํŠธ(Host)์—์„œ ํ˜ธ์ถœํ•˜๋ฉด ๋””๋ฐ”์ด์Šค(Device)์—์„œ ๋ณ‘๋ ฌ ์‹คํ–‰

์ ์œ ์œจ(Occupancy):
- ํ•œ SM ์•ˆ์— ๋™์‹œ์— ์ƒ์ฃผํ•˜๋Š” ํ™œ์„ฑ ์›Œํ”„ ์ˆ˜์˜ ๋น„์œจ
- ๋ ˆ์ง€์Šคํ„ฐ ์‚ฌ์šฉ๋Ÿ‰, ๋ธ”๋ก๋‹น ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰, ๋ธ”๋ก ํฌ๊ธฐ๊ฐ€ ์ ์œ ์œจ์„ ํ•จ๊ป˜ ๊ฒฐ์ •ํ•œ๋‹ค.
- ์ ์œ ์œจ์ด ๋†’๋‹ค๊ณ  ํ•ญ์ƒ ๊ฐ€์žฅ ๋น ๋ฅธ ๊ฒƒ์€ ์•„๋‹ˆ์ง€๋งŒ, ๋ฉ”๋ชจ๋ฆฌ ์ง€์—ฐ ์‹œ๊ฐ„์„ ์ˆจ๊ธธ ์ˆ˜ ์žˆ๋Š” ์›Œํ”„ ์ˆ˜๋ฅผ ํ™•๋ณดํ•˜๋Š” ๋ฐ ์ค‘์š”ํ•˜๋‹ค.

์ŠคํŠธ๋ฆฌ๋ฐ ๋ฉ€ํ‹ฐํ”„๋กœ์„ธ์„œ(SM)

SM ๊ตฌ์กฐ

NVIDIA GPU์˜ ํ•ต์‹ฌ ์—ฐ์‚ฐ ์œ ๋‹›์ธ SM์€ ์›Œํ”„ ์‹คํ–‰, ๋ฐ์ดํ„ฐ ์ด๋™, ์˜จ์นฉ ๋ฉ”๋ชจ๋ฆฌ ์žฌ์‚ฌ์šฉ์„ ์œ„ํ•œ ์—ฌ๋Ÿฌ ๋ฆฌ์†Œ์Šค๋ฅผ ํฌํ•จํ•œ๋‹ค:

๊ตฌ์„ฑ ์š”์†Œ H100 SM ๊ธฐ์ค€ ์„ค๋ช…
์›Œํ”„ ์Šค์ผ€์ค„๋Ÿฌ 4๊ฐœ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ์›Œํ”„๋ฅผ ์„ ํƒํ•˜๊ณ  ๋ช…๋ น์–ด ๋ฐœํ–‰
FP32 ์—ฐ์‚ฐ ์ฒ˜๋ฆฌ๋Ÿ‰ Ampere ๋Œ€๋น„ 2๋ฐฐ/์‚ฌ์ดํด FP32 ์ค‘์‹ฌ ์ปค๋„ ์ฒ˜๋ฆฌ๋Ÿ‰ ํ–ฅ์ƒ
๋ ˆ์ง€์Šคํ„ฐ ํŒŒ์ผ 64K x 32-bit ๋ ˆ์ง€์Šคํ„ฐ ์Šค๋ ˆ๋“œ๋ณ„ ์ƒํƒœ์™€ ์ค‘๊ฐ„๊ฐ’ ์ €์žฅ
ํ†ตํ•ฉ L1/ํ…์Šค์ฒ˜/๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ ์ตœ๋Œ€ 256KB L1, ํ…์Šค์ฒ˜ ์บ์‹œ, ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ carveout ๊ณต์œ 
๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ ์ตœ๋Œ€ 228KB/SM, ์ตœ๋Œ€ 227KB/๋ธ”๋ก ๋ธ”๋ก ๋‚ด๋ถ€ ์žฌ์‚ฌ์šฉ๊ณผ ํƒ€์ผ๋ง ์ตœ์ ํ™”
Tensor Memory Accelerator Hopper ์ถ”๊ฐ€ ๊ธ€๋กœ๋ฒŒ ๋ฉ”๋ชจ๋ฆฌ์™€ ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์ด ๋น„๋™๊ธฐ ํ…์„œ ์ „์†ก
Tensor Core 4์„ธ๋Œ€ MMA, WGMMA ๊ธฐ๋ฐ˜ ํ–‰๋ ฌ ์—ฐ์‚ฐ ๊ฐ€์†

SM ์Šค์ผ€์ค„๋ง ๋™์ž‘:
1. ์›Œํ”„ ์Šค์ผ€์ค„๋Ÿฌ๊ฐ€ ์˜์กด์„ฑ์ด ํ•ด์†Œ๋œ ํ™œ์„ฑ ์›Œํ”„๋ฅผ ์„ ํƒํ•œ๋‹ค.
2. ์„ ํƒ๋œ ์›Œํ”„์˜ ๋ช…๋ น์–ด๋ฅผ ์ ์ ˆํ•œ ์‹คํ–‰ ํŒŒ์ดํ”„์— ๋ฐœํ–‰ํ•œ๋‹ค.
3. ์—ฐ์‚ฐ ๊ฒฐ๊ณผ๋Š” ๋ ˆ์ง€์Šคํ„ฐ์— ๊ธฐ๋ก๋˜๊ณ , ํ•„์š” ์‹œ ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ๋‚˜ ๊ธ€๋กœ๋ฒŒ ๋ฉ”๋ชจ๋ฆฌ๋กœ ์ด๋™ํ•œ๋‹ค.
4. ๋ฉ”๋ชจ๋ฆฌ ๋Œ€๊ธฐ๋‚˜ ๋ถ„๊ธฐ ๋•Œ๋ฌธ์— ๋ฉˆ์ถ˜ ์›Œํ”„ ๋Œ€์‹  ๋‹ค๋ฅธ ์›Œํ”„๋ฅผ ์‹คํ–‰ํ•ด ์ง€์—ฐ ์‹œ๊ฐ„์„ ์ˆจ๊ธด๋‹ค.

CUDA ๋ฉ”๋ชจ๋ฆฌ ๊ณ„์ธต

๋ฉ”๋ชจ๋ฆฌ ๊ณ„์ธต

CUDA๋Š” ๋‹ค์–‘ํ•œ ํŠน์„ฑ์„ ๊ฐ€์ง„ ๋ฉ”๋ชจ๋ฆฌ ๊ณ„์ธต์„ ์ œ๊ณตํ•œ๋‹ค:

๋ฉ”๋ชจ๋ฆฌ ์œ ํ˜• ๋ฒ”์œ„ ์ง€์—ฐ ์‹œ๊ฐ„ ๋Œ€์—ญํญ ํฌ๊ธฐ ํ™œ์šฉ ์˜ˆ์‹œ
๋ ˆ์ง€์Šคํ„ฐ ์Šค๋ ˆ๋“œ๋ณ„ ~1ํด๋Ÿญ ์ตœ๊ณ  ์ˆ˜์‹ญKB/SM ์ง€์—ญ ๋ณ€์ˆ˜
๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ ๋ธ”๋ก ๋‚ด ~5ํด๋Ÿญ ๋†’์Œ ์ตœ๋Œ€ 228KB/SM ๋ธ”๋ก ๋‚ด ๋ฐ์ดํ„ฐ ๊ณต์œ 
์ƒ์ˆ˜ ๋ฉ”๋ชจ๋ฆฌ ๋””๋ฐ”์ด์Šค ์ „์ฒด ~100ํด๋Ÿญ ์บ์‹œ๋จ 64KB ์ฝ๊ธฐ ์ „์šฉ ์ƒ์ˆ˜
ํ…์Šค์ฒ˜ ๋ฉ”๋ชจ๋ฆฌ ๋””๋ฐ”์ด์Šค ์ „์ฒด ์บ์‹œ ์˜์กด ์บ์‹œ๋จ ๋™์  2D ๊ณต๊ฐ„ ์ง€์—ญ์„ฑ ํ™œ์šฉ
๊ธ€๋กœ๋ฒŒ ๋ฉ”๋ชจ๋ฆฌ ๋””๋ฐ”์ด์Šค ์ „์ฒด ~500ํด๋Ÿญ ๋†’์Œ ์ˆ˜์‹ญGB ์ž…์ถœ๋ ฅ ๋ฒ„ํผ
๋กœ์ปฌ ๋ฉ”๋ชจ๋ฆฌ ์Šค๋ ˆ๋“œ๋ณ„ ~500ํด๋Ÿญ ๋†’์Œ ๋™์  ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ ๋ณ€์ˆ˜

๋ฉ”๋ชจ๋ฆฌ ์ ‘๊ทผ ์ตœ์ ํ™” ๊ธฐ๋ฒ•:
- Coalescing: ๊ฐ™์€ ์›Œํ”„์˜ ์Šค๋ ˆ๋“œ๋“ค์ด ์ธ์ ‘ ์ฃผ์†Œ์— ์ ‘๊ทผํ•˜๋ฉด ํ•˜๋‚˜์˜ ๋ฉ”๋ชจ๋ฆฌ ํŠธ๋žœ์žญ์…˜์œผ๋กœ ์ฒ˜๋ฆฌ
- ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ ๋ฑ…ํฌ ์ปจํ”Œ๋ฆญํŠธ: 32๊ฐœ ๋ฑ…ํฌ๋กœ ๊ตฌ์„ฑ๋œ ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์ธ์ ‘ ์Šค๋ ˆ๋“œ๊ฐ€ ๋‹ค๋ฅธ ๋ฑ…ํฌ์— ์ ‘๊ทผํ•ด์•ผ ํšจ์œจ์ 
- ๋น„๋™๊ธฐ ๋ณต์‚ฌ์™€ TMA: cp.async, cuda::memcpy_async, TMA๋ฅผ ์ด์šฉํ•ด ๋ฐ์ดํ„ฐ ์ด๋™๊ณผ ๊ณ„์‚ฐ์„ ๊ฒน์น  ์ˆ˜ ์žˆ์Œ

์Šค์ผ€์ค„๋ง ๋ฉ”์ปค๋‹ˆ์ฆ˜

CUDA์˜ ์Šค์ผ€์ค„๋ง์€ ์—ฌ๋Ÿฌ ์ˆ˜์ค€์—์„œ ๋™์ž‘ํ•œ๋‹ค:

๋ธ”๋ก ์Šค์ผ€์ค„๋ง:
- ๊ทธ๋ฆฌ๋“œ ๋‚ด ๋ธ”๋ก์„ SM์— ๋ฐฐ์น˜ํ•˜๋Š” ๋‹จ๊ณ„
- ์Šค์ผ€์ค„๋Ÿฌ๋Š” ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ SM์˜ ์ˆ˜์™€ ๋ธ”๋ก์˜ ๋ฆฌ์†Œ์Šค ์š”๊ตฌ๋Ÿ‰์„ ๊ณ ๋ คํ•˜์—ฌ ๋ฐฐ์น˜
- ๋ธ”๋ก์€ ๋…๋ฆฝ์ ์œผ๋กœ ์‹คํ–‰๋˜๋ฏ€๋กœ ์ˆœ์„œ ๋ณด์žฅ ๋ถˆ๊ฐ€

์›Œํ”„ ์Šค์ผ€์ค„๋ง:
- SM ๋‚ด์—์„œ ํ™œ์„ฑ ์›Œํ”„ ์ค‘ ๋‹ค์Œ์— ์‹คํ–‰ํ•  ์›Œํ”„๋ฅผ ์„ ํƒ
- ๊ตฌํ˜„ ์„ธ๋ถ€ ์ •์ฑ…์€ ์„ธ๋Œ€์™€ ๋งˆ์ดํฌ๋กœ์•„ํ‚คํ…์ฒ˜์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง€์ง€๋งŒ, ์—ฐ๊ตฌ์™€ ์ตœ์ ํ™” ๋ฌธํ—Œ์—์„œ๋Š” ์ฃผ๋กœ LRR(Loose Round Robin), GTO(Greedy-Then-Oldest), Two-Level ๊ฐ™์€ ์ •์ฑ…์œผ๋กœ ์„ค๋ช…ํ•œ๋‹ค.
- ๊ฐœ๋ฐœ์ž๋Š” ์ •์ฑ… ์ด๋ฆ„ ์ž์ฒด๋ณด๋‹ค ์›Œํ”„ ์ˆ˜, ๋ฉ”๋ชจ๋ฆฌ ๋Œ€๊ธฐ, ๋ถ„๊ธฐ, ๋ช…๋ น์–ด ์ˆ˜์ค€ ๋ณ‘๋ ฌ์„ฑ์ด ์‹ค์ œ ์„ฑ๋Šฅ์— ๋ฏธ์น˜๋Š” ์˜ํ–ฅ์„ ๋” ์ค‘์š”ํ•˜๊ฒŒ ๋ด์•ผ ํ•œ๋‹ค.

์ง€์—ฐ ์‹œ๊ฐ„ ์€๋‹‰(Latency Hiding):
- ๋ฉ”๋ชจ๋ฆฌ ์ง€์—ฐ ์‹œ๊ฐ„์„ ์ˆจ๊ธฐ๊ธฐ ์œ„ํ•ด ์—ฌ๋Ÿฌ ์›Œํ”„๋ฅผ ๋ฒˆ๊ฐˆ์•„ ์‹คํ–‰
- ํ•œ ์›Œํ”„๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ ๋Œ€๊ธฐ ์ค‘์ผ ๋•Œ ๋‹ค๋ฅธ ์›Œํ”„๋ฅผ ์‹คํ–‰ํ•˜์—ฌ SM ํ™œ์šฉ๋„ ๊ทน๋Œ€ํ™”

๋น„๊ต/๋ถ„์„

GPU ์•„ํ‚คํ…์ฒ˜ ์„ธ๋Œ€๋ณ„ CUDA ๋ณ€๊ฒฝ์‚ฌํ•ญ

์„ธ๋Œ€ ์•„ํ‚คํ…์ฒ˜ ์ฃผ์š” CUDA ๋ณ€๊ฒฝ์‚ฌํ•ญ ๋ฉ”๋ชจ๋ฆฌ ํŠน์„ฑ
sm_50 Maxwell ํ†ตํ•ฉ L2 ๊ฐœ์„ , ๋น„๊ต์  ๋‹จ์ˆœํ•œ ๋ฉ”๋ชจ๋ฆฌ ํŒŒ์ดํ”„๋ผ์ธ L1/๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ ๋ถ„๋ฆฌ
sm_60 Pascal Unified Memory ๊ฐœ์„ , NVLink 1์„ธ๋Œ€ ํ™•์žฅ HBM2 ๋„์ž…
sm_70 Volta Tensor Core ๋„์ž…, Independent Thread Scheduling HBM2, NVLink 2.0
sm_75 Turing Tensor Core 2์„ธ๋Œ€, INT ์—ฐ์‚ฐ ๊ฒฝ๋กœ ๊ฐ•ํ™” GDDR6/HBM2
sm_80 Ampere cp.async, ๋น„๋™๊ธฐ ๋ฐฐ๋ฆฌ์–ด, Tensor Core 3์„ธ๋Œ€ HBM2e, L2 ํ™•๋Œ€
sm_86 Ampere ํด๋ผ์ด์–ธํŠธ GPU ์ค‘์‹ฌ ์ž์› ๊ตฌ์„ฑ GDDR6/GDDR6X
sm_90 Hopper TMA, Thread Block Cluster, ๋ถ„์‚ฐ ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ, WGMMA HBM3, ํ†ตํ•ฉ L1/ํ…์Šค์ฒ˜/๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ 256KB

๋ฉ”๋ชจ๋ฆฌ ์ ‘๊ทผ ํŒจํ„ด ๋น„๊ต

ํŒจํ„ด ์„ฑ๋Šฅ ์„ค๋ช…
Coalesced (์ตœ์ ) 100% 128B ์ •๋ ฌ๋œ ์ ‘๊ทผ์œผ๋กœ ๋‹จ์ผ ํŠธ๋žœ์žญ์…˜
Partial Coalescing 50~75% ์ผ๋ถ€ ์Šค๋ ˆ๋“œ๋งŒ ์ธ์ ‘ ์ฃผ์†Œ ์ ‘๊ทผ
Strided (์ตœ์•…) 10~25% ์ŠคํŠธ๋ผ์ด๋“œ๊ฐ€ ํฐ ๊ฐ„๊ฒฉ์œผ๋กœ ์ ‘๊ทผ
Random ๋ณ€๋™ ์˜ˆ์ธก ๋ถˆ๊ฐ€๋Šฅํ•œ ์ ‘๊ทผ ํŒจํ„ด

์Šค์ผ€์ค„๋ง ์ •์ฑ… ๋น„๊ต

์ •์ฑ… ์žฅ์  ๋‹จ์  ์ ์šฉ ์‹œ์ 
GTO ์˜ค๋ž˜ ๋Œ€๊ธฐํ•œ ์›Œํ”„๋ฅผ ์šฐ์„  ์†Œ๋ชจํ•ด locality ์œ ์ง€์— ์œ ๋ฆฌ ํŠน์ • ์›Œํ”„๊ฐ€ ์˜ค๋ž˜ ์ ์œ ํ•  ์ˆ˜ ์žˆ์Œ ๊ณ„์‚ฐ ๋น„์ค‘์ด ํฐ ์ปค๋„
LRR ์›Œํ”„ ๊ฐ„ ๊ณต์ •์„ฑ์ด ๋†’๊ณ  ๋‹จ์ˆœํ•จ locality ํ™œ์šฉ์ด ์•ฝํ•  ์ˆ˜ ์žˆ์Œ ์ผ๋ฐ˜์  ๊ธฐ๋ณธ ์ •์ฑ… ์„ค๋ช…
Two-Level ํ™œ์„ฑ ์ง‘ํ•ฉ์„ ์ œํ•œํ•ด ์บ์‹œ์™€ ๋ฉ”๋ชจ๋ฆฌ ๋ณ‘๋ชฉ์„ ์กฐ์ ˆ ๊ตฌํ˜„์ด ๋ณต์žกํ•จ ๋ฉ”๋ชจ๋ฆฌ ๋ณ‘๋ชฉ์ด ํฐ ์ƒํ™ฉ

๋™์ž‘ ์›๋ฆฌ

์ปค๋„ ์‹คํ–‰ ํ๋ฆ„

  1. ํ˜ธ์ŠคํŠธ์—์„œ ์ปค๋„ ํ˜ธ์ถœ:
    c kernel<<<gridDim, blockDim>>>(args);
    - gridDim: ๊ทธ๋ฆฌ๋“œ ํฌ๊ธฐ (๋ธ”๋ก ์ˆ˜)
    - blockDim: ๋ธ”๋ก ํฌ๊ธฐ (์Šค๋ ˆ๋“œ ์ˆ˜)

  2. ๋ธ”๋ก ๋ฐฐ์น˜:
    - GPU์˜ ์Šค์ผ€์ค„๋Ÿฌ๊ฐ€ ๊ฐ ๋ธ”๋ก์„ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ SM์— ๋ฐฐ์น˜
    - ํ•˜๋‚˜์˜ SM์—๋Š” ์—ฌ๋Ÿฌ ๋ธ”๋ก์ด ํ• ๋‹น๋  ์ˆ˜ ์žˆ์Œ (๋ฆฌ์†Œ์Šค ํ—ˆ์šฉ ์‹œ)

  3. ์Šค๋ ˆ๋“œ ์ƒ์„ฑ ๋ฐ ์‹คํ–‰:

    • ๊ฐ SM์€ ํ• ๋‹น๋œ ๋ธ”๋ก์˜ ์Šค๋ ˆ๋“œ๋ฅผ ์›Œํ”„ ๋‹จ์œ„๋กœ ์ƒ์„ฑ
    • 32๊ฐœ ์Šค๋ ˆ๋“œ์”ฉ ๊ทธ๋ฃนํ™”๋˜์–ด SIMT ๋ฐฉ์‹์œผ๋กœ ์‹คํ–‰
  4. ๋™๊ธฐํ™” ๋ฐ ์™„๋ฃŒ:
    - ๋ธ”๋ก ๋‚ด ์Šค๋ ˆ๋“œ ๋™๊ธฐํ™”: __syncthreads()
    - ์ปค๋„ ์™„๋ฃŒ ๋Œ€๊ธฐ: cudaDeviceSynchronize()

๋ฉ”๋ชจ๋ฆฌ ์ ‘๊ทผ ๋™์ž‘

๊ธ€๋กœ๋ฒŒ ๋ฉ”๋ชจ๋ฆฌ Coalescing:
- ์›Œํ”„์˜ 32๊ฐœ ์Šค๋ ˆ๋“œ๊ฐ€ ์—ฐ์†๋œ 128B ์ฃผ์†Œ์— ์ ‘๊ทผํ•˜๋ฉด ๋‹จ์ผ 128B ๋ฉ”๋ชจ๋ฆฌ ํŠธ๋žœ์žญ์…˜์œผ๋กœ ์ฒ˜๋ฆฌ
- 32๊ฐœ ์Šค๋ ˆ๋“œ๊ฐ€ ๊ฐ๊ฐ 4B(FP32)์”ฉ ์ ‘๊ทผ ์‹œ 128B = 32 ร— 4B

๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ ๋ฑ…ํฌ ์ปจํ”Œ๋ฆญํŠธ:
- 32๊ฐœ ๋ฑ…ํฌ๋กœ ๊ตฌ์„ฑ, ๊ฐ ๋ฑ…ํฌ๋Š” 4B ํญ
- ๊ฐ™์€ ์›Œํ”„์˜ ์Šค๋ ˆ๋“œ๊ฐ€ ๊ฐ™์€ ๋ฑ…ํฌ์— ์ ‘๊ทผํ•˜๋ฉด ์ ‘๊ทผ์ด ์ง๋ ฌํ™”๋  ์ˆ˜ ์žˆ๋‹ค.
- ํŒจ๋“œ ์ถ”๊ฐ€(shared float pad[N+1])๋กœ ์ปจํ”Œ๋ฆญํŠธ ํ•ด์†Œ

์ ์œ ์œจ๊ณผ ํŒŒ์ดํ”„๋ผ์ธ ๊ฒน์น˜๊ธฐ:
- ๋ธ”๋ก ํฌ๊ธฐ์™€ ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์ด ํฌ๋ฉด ๋™์‹œ์— ์ƒ์ฃผ ๊ฐ€๋Šฅํ•œ ์›Œํ”„ ์ˆ˜๊ฐ€ ์ค„์–ด๋“ ๋‹ค.
- ๋ฐ˜๋Œ€๋กœ ์ ์ ˆํ•œ ์ ์œ ์œจ๊ณผ cp.async ๋˜๋Š” TMA ๊ธฐ๋ฐ˜ ํ”„๋ฆฌํŽ˜์น˜๋ฅผ ์กฐํ•ฉํ•˜๋ฉด ๋ฉ”๋ชจ๋ฆฌ ๋กœ๋“œ์™€ ๊ณ„์‚ฐ์„ ๊ฒน์ณ ์‹คํšจ ์ฒ˜๋ฆฌ๋Ÿ‰์„ ๋†’์ผ ์ˆ˜ ์žˆ๋‹ค.

ํ…์„œ ์ฝ”์–ด ํ™œ์šฉ

Tensor Core๋Š” ํ–‰๋ ฌ ๊ณฑ์…ˆ-๋ˆ„์‚ฐ(MMA) ์—ฐ์‚ฐ์„ ํ•˜๋“œ์›จ์–ด ์ˆ˜์ค€์—์„œ ๊ฐ€์†ํ™”ํ•œ๋‹ค:

WGMMA(Warp Group Matrix Multiply-Accumulate):
- Hopper์—์„œ ๋„์ž…๋œ ์›Œํ”„ ๊ทธ๋ฃน ๋‹จ์œ„ MMA ๋ช…๋ น์–ด
- 4๊ฐœ ์›Œํ”„(128 ์Šค๋ ˆ๋“œ)๊ฐ€ ํ˜‘๋ ฅํ•˜์—ฌ ํฐ ํƒ€์ผ ํ–‰๋ ฌ ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰
- TMA์™€ ์กฐํ•ฉํ•˜๋ฉด ๊ธ€๋กœ๋ฒŒ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ๋กœ ๊ฐ€์ ธ์˜จ ํƒ€์ผ์„ ํšจ์œจ์ ์œผ๋กœ ์†Œ๋น„ํ•  ์ˆ˜ ์žˆ๋‹ค.

WMMA ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ธํ„ฐํŽ˜์ด์Šค:

// 16x16x16 ํ–‰๋ ฌ ๊ณฑ์…ˆ ์˜ˆ์‹œ
wmma::fragment<wmma::matrix_a, 16, 16, 16, half, wmma::row_major> a_frag;
wmma::fragment<wmma::matrix_b, 16, 16, 16, half, wmma::col_major> b_frag;
wmma::fragment<wmma::accumulator, 16, 16, 16, float> c_frag;
wmma::mma_sync(c_frag, a_frag, b_frag, c_frag);

์žฅ๋‹จ์ 

์žฅ์ 

  • ํ’๋ถ€ํ•œ ์ƒํƒœ๊ณ„: cuBLAS, cuDNN, NCCL, TensorRT ๋“ฑ ์ตœ๋Œ€ ๊ทœ๋ชจ์˜ GPU ๊ฐ€์† ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
  • ๋ฒ”์šฉ์„ฑ: AI, HPC, ๊ทธ๋ž˜ํ”ฝ์Šค, ๋ฐ์ดํ„ฐ ๋ถ„์„ ๋“ฑ ๋‹ค์–‘ํ•œ ๋„๋ฉ”์ธ ์ง€์›
  • ์„ธ๋ฐ€ํ•œ ์ œ์–ด: ๋ฉ”๋ชจ๋ฆฌ ์ ‘๊ทผ ํŒจํ„ด, ์Šค์ผ€์ค„๋ง, ๋™๊ธฐํ™”๋ฅผ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ˆ˜์ค€์—์„œ ์ œ์–ด ๊ฐ€๋Šฅ
  • ๋„๊ตฌ ์ฒด์ธ: Nsight Systems, Nsight Compute, CUPTI ๋“ฑ ํ’๋ถ€ํ•œ ํ”„๋กœํŒŒ์ผ๋ง ๋„๊ตฌ
  • ํ˜ธํ™˜์„ฑ: NVIDIA GPU ์ „์ฒด ๋ผ์ธ์—…์—์„œ ๋™์ผํ•œ CUDA ์ฝ”๋“œ ์‹คํ–‰ ๊ฐ€๋Šฅ
  • ์ง„ํ™”์  ๋ฐœ์ „: ์„ธ๋Œ€๋ณ„๋กœ TMA, ๋ถ„์‚ฐ ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ ๋“ฑ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ ์ง€์† ์ถ”๊ฐ€

๋‹จ์ 

  • NVIDIA ์ข…์†: NVIDIA GPU์—์„œ๋งŒ ์‹คํ–‰ ๊ฐ€๋Šฅ, AMD/Intel GPU๋Š” ์ง€์› ๋ถˆ๊ฐ€
  • ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ ๋ณต์žก์„ฑ: ๋‹ค์–‘ํ•œ ๋ฉ”๋ชจ๋ฆฌ ๊ณ„์ธต์˜ ์ ์ ˆํ•œ ํ™œ์šฉ ํ•„์š”
  • ์Šค์ผ€์ค„๋ง ์˜ค๋ฒ„ํ—ค๋“œ: ๋ธ”๋ก/์›Œํ”„ ์Šค์ผ€์ค„๋ง์œผ๋กœ ์ธํ•œ ๊ฐ„์ ‘ ๋น„์šฉ
  • ๋™๊ธฐํ™” ์ œ์•ฝ: ํ˜ธ์ŠคํŠธ-๋””๋ฐ”์ด์Šค ๊ฐ„ ๋™๊ธฐํ™”๋กœ ์ธํ•œ ์ž ์žฌ์  ๋ณ‘๋ชฉ
  • ์ „๋ ฅ ์†Œ๋น„: ๋Œ€๊ทœ๋ชจ ๋ณ‘๋ ฌ ์‹คํ–‰ ์‹œ ๋†’์€ ์ „๋ ฅ ์†Œ๋ชจ

๊ด€๋ จ ๊ธฐ์ˆ 

์ฐธ๊ณ  ํ‘œ์ค€ ๋ฐ ์ž๋ฃŒ

  • NVIDIA CUDA Programming Guide (์ตœ์‹  ๋ฒ„์ „)
  • NVIDIA CUDA C++ Best Practices Guide
  • NVIDIA Hopper Tuning Guide
  • NVIDIA GPU Architecture Whitepapers (Volta, Ampere, Hopper)
  • ACM/IEEE GPU ์Šค์ผ€์ค„๋ง ๋ฐ ๋ฉ”๋ชจ๋ฆฌ ์ตœ์ ํ™” ์—ฐ๊ตฌ ๋ฌธํ—Œ

๊ด€๋ จ ๋ฌธ์„œ

ํ•ต์‹ฌ ์ •๋ฆฌ

  1. CUDA๋Š” NVIDIA GPU์˜ ๋ฒ”์šฉ ๋ณ‘๋ ฌ ์—ฐ์‚ฐ ๋Šฅ๋ ฅ์„ ํ”„๋กœ๊ทธ๋ž˜๋ฐํ•  ์ˆ˜ ์žˆ๋Š” ํ”Œ๋žซํผ์œผ๋กœ, ์Šค๋ ˆ๋“œ ๋ธ”๋ก/๊ทธ๋ฆฌ๋“œ/์›Œํ”„์˜ ๊ณ„์ธต์ ์ธ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ชจ๋ธ์„ ์ œ๊ณตํ•œ๋‹ค.
  2. SM(Streaming Multiprocessor)์€ CUDA์˜ ํ•ต์‹ฌ ์—ฐ์‚ฐ ์œ ๋‹›์œผ๋กœ, ์›Œํ”„ ์Šค์ผ€์ค„๋Ÿฌ, ๋ ˆ์ง€์Šคํ„ฐ ํŒŒ์ผ, ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ, ์—ฐ์‚ฐ ํŒŒ์ดํ”„๋ฅผ ํ•จ๊ป˜ ์ œ๊ณตํ•œ๋‹ค.
  3. CUDA ๋ฉ”๋ชจ๋ฆฌ ๊ณ„์ธต์€ ๋ ˆ์ง€์Šคํ„ฐ, ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ, ๊ธ€๋กœ๋ฒŒ ๋ฉ”๋ชจ๋ฆฌ ๋“ฑ์œผ๋กœ ๊ตฌ์„ฑ๋˜๋ฉฐ, ๊ฐ๊ฐ ๋‹ค๋ฅธ ์ ‘๊ทผ ์†๋„์™€ ๋ฒ”์œ„๋ฅผ ๊ฐ€์ง„๋‹ค.
  4. ํšจ์œจ์ ์ธ CUDA ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์œ„ํ•ด์„œ๋Š” ๋ฉ”๋ชจ๋ฆฌ Coalescing, ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ ๋ฑ…ํฌ ์ปจํ”Œ๋ฆญํŠธ ํšŒํ”ผ, ์›Œํ”„ ์Šค์ผ€์ค„๋ง ํ™œ์šฉ์ด ์ค‘์š”ํ•˜๋‹ค.
  5. CUDA๋Š” ์ง€์†์ ์œผ๋กœ ๋ฐœ์ „ํ•˜์—ฌ TMA, ๋ถ„์‚ฐ ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ, WGMMA ๋“ฑ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๋ฉฐ AI/HPC ์›Œํฌ๋กœ๋“œ์˜ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ค๊ณ  ์žˆ๋‹ค.