CUDA ์์ธ
๊ฐ์
CUDA(Compute Unified Device Architecture)๋ NVIDIA๊ฐ 2007๋ ์ ๋์ ํ ๋ณ๋ ฌ ์ปดํจํ ํ๋ซํผ์ด์ ํ๋ก๊ทธ๋๋ฐ ๋ชจ๋ธ๋ก, GPU์ ๋ฒ์ฉ ์ฐ์ฐ ์์์ C/C++ ๊ธฐ๋ฐ ์ฝ๋์ ์ ์ฉ ๋ฐํ์์ผ๋ก ํ์ฉํ ์ ์๊ฒ ํด์ค๋ค. ๊ฐ๋ฐ์๋ ๊ฐ์ ํ๋ก๊ทธ๋จ ์์์ ํธ์คํธ CPU ์ฝ๋์ ๋๋ฐ์ด์ค GPU ์ปค๋์ ํจ๊ป ์์ฑํ๋ฉฐ, AI ํ๋ จ/์ถ๋ก , ๊ณผํ ๊ณ์ฐ, ๋ฐ์ดํฐ ๋ถ์, ๋ฏธ๋์ด ์ฒ๋ฆฌ์ฒ๋ผ ๋ฐ์ดํฐ ๋ณ๋ ฌ์ฑ์ด ํฐ ์์ ์ GPU๋ก ์คํ๋ก๋ฉํ ์ ์๋ค.
CUDA์ ํต์ฌ์ GPU ํ๋์จ์ด ๊ตฌ์กฐ๋ฅผ ์ํํธ์จ์ด ๊ณ์ธต์ผ๋ก ๋ ธ์ถํ๋ค๋ ์ ์ด๋ค. NVIDIA GPU๋ ๋ค์์ ์คํธ๋ฆฌ๋ฐ ๋ฉํฐํ๋ก์ธ์(SM)๋ก ๊ตฌ์ฑ๋๊ณ , ๊ฐ SM์ ์ํ ์ค์ผ์ค๋ฌ, ๋ ์ง์คํฐ ํ์ผ, ๊ณต์ ๋ฉ๋ชจ๋ฆฌ, ์ฐ์ฐ ์ ๋์ ๋ฐํ์ผ๋ก ๋ง์ ์ค๋ ๋๋ฅผ ๋์์ ์ฒ๋ฆฌํ๋ค. CUDA๋ ์ด๋ฅผ ์ค๋ ๋, ์ค๋ ๋ ๋ธ๋ก, ๊ทธ๋ฆฌ๋, ์ํ, ์คํธ๋ฆผ ๊ฐ์ ์ถ์ํ๋ก ์ ๊ณตํด ๊ฐ๋ฐ์๊ฐ ํ๋์จ์ด ์ธ๋ถ ๊ตฌ์กฐ๋ฅผ ์ดํดํ๋ฉด์๋ ์ด์ ๊ฐ๋ฅํ ๋ณ๋ ฌ ํ๋ก๊ทธ๋จ์ ์์ฑํ๊ฒ ๋๋๋ค.
ํต์ฌ ๊ฐ๋
CUDA ํ๋ก๊ทธ๋๋ฐ ๋ชจ๋ธ
CUDA ํ๋ก๊ทธ๋๋ฐ ๋ชจ๋ธ์ ๊ณ์ธต์ ์ธ ์ค๋ ๋ ์กฐ์ง๊ณผ ๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ ๋ฐฉ๋ฒ์ ์ ์ํ๋ค.
์ค๋ ๋ ๊ณ์ธต ๊ตฌ์กฐ:
- ์ค๋ ๋(Thread): ๊ฐ์ฅ ์์ ์คํ ๋จ์. ๊ฐ ์ค๋ ๋๋ ๋
๋ฆฝ์ ์ธ ํ๋ก๊ทธ๋จ ์นด์ดํฐ, ๋ ์ง์คํฐ ์ํ, ์ค๋ ๋ ์ธ๋ฑ์ค๋ฅผ ๊ฐ์ง๋ค.
- ์ค๋ ๋ ๋ธ๋ก(Thread Block): ์ฌ๋ฌ ์ค๋ ๋๊ฐ ๋ฌถ์ธ ํ์
๋จ์. ๊ฐ์ ๋ธ๋ก ์์ ์ค๋ ๋๋ __shared__ ๋ฉ๋ชจ๋ฆฌ๋ก ๋ฐ์ดํฐ๋ฅผ ๊ตํํ๊ณ __syncthreads()๋ก ๋๊ธฐํํ ์ ์๋ค.
- ๊ทธ๋ฆฌ๋(Grid): ํ๋์ ์ปค๋ ์คํ์์ ์์ฑ๋๋ ์ ์ฒด ๋ธ๋ก ์งํฉ. ๋ธ๋ก ๊ฐ ์คํ ์์๋ ๋ณด์ฅ๋์ง ์์ผ๋ฏ๋ก ๋ธ๋ก ๊ฐ ์ง์ ๋๊ธฐํ ์์ด ๋์ํ๋๋ก ์ค๊ณํด์ผ ํ๋ค.
์ํ(Warp):
- 32๊ฐ ์ค๋ ๋๊ฐ ์ด๋ฃจ๋ ๊ธฐ๋ณธ ์ค์ผ์ค๋ง ๋จ์
- ํ๋์จ์ด๋ ๊ฐ์ ์ํ์ ์ค๋ ๋๋ค์ SIMT(Single Instruction, Multiple Thread) ๋ฐฉ์์ผ๋ก ์คํํ๋ค.
- ์ํ ๋ด๋ถ์์ ๋ถ๊ธฐ ๊ฒฝ๋ก๊ฐ ๊ฐ๋ผ์ง๋ฉด ๊ฐ์ ์ํ๊ฐ ์ฌ๋ฌ ๊ฒฝ๋ก๋ฅผ ์์ฐจ์ ์ผ๋ก ์ฒ๋ฆฌํ๋ฏ๋ก ์ฒ๋ฆฌ ํจ์จ์ด ๋ฎ์์ง ์ ์๋ค.
์ปค๋(Kernel):
- GPU์์ ์คํ๋๋ ํจ์. __global__ ํค์๋๋ก ์ ์ธ
- ํธ์คํธ(Host)์์ ํธ์ถํ๋ฉด ๋๋ฐ์ด์ค(Device)์์ ๋ณ๋ ฌ ์คํ
์ ์ ์จ(Occupancy):
- ํ 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 | ํ์ฑ ์งํฉ์ ์ ํํด ์บ์์ ๋ฉ๋ชจ๋ฆฌ ๋ณ๋ชฉ์ ์กฐ์ | ๊ตฌํ์ด ๋ณต์กํจ | ๋ฉ๋ชจ๋ฆฌ ๋ณ๋ชฉ์ด ํฐ ์ํฉ |
๋์ ์๋ฆฌ
์ปค๋ ์คํ ํ๋ฆ
-
ํธ์คํธ์์ ์ปค๋ ํธ์ถ:
c kernel<<<gridDim, blockDim>>>(args);
-gridDim: ๊ทธ๋ฆฌ๋ ํฌ๊ธฐ (๋ธ๋ก ์)
-blockDim: ๋ธ๋ก ํฌ๊ธฐ (์ค๋ ๋ ์) -
๋ธ๋ก ๋ฐฐ์น:
- GPU์ ์ค์ผ์ค๋ฌ๊ฐ ๊ฐ ๋ธ๋ก์ ์ฌ์ฉ ๊ฐ๋ฅํ SM์ ๋ฐฐ์น
- ํ๋์ SM์๋ ์ฌ๋ฌ ๋ธ๋ก์ด ํ ๋น๋ ์ ์์ (๋ฆฌ์์ค ํ์ฉ ์) -
์ค๋ ๋ ์์ฑ ๋ฐ ์คํ:
- ๊ฐ SM์ ํ ๋น๋ ๋ธ๋ก์ ์ค๋ ๋๋ฅผ ์ํ ๋จ์๋ก ์์ฑ
- 32๊ฐ ์ค๋ ๋์ฉ ๊ทธ๋ฃนํ๋์ด SIMT ๋ฐฉ์์ผ๋ก ์คํ
-
๋๊ธฐํ ๋ฐ ์๋ฃ:
- ๋ธ๋ก ๋ด ์ค๋ ๋ ๋๊ธฐํ:__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 ์ค์ผ์ค๋ง ๋ฐ ๋ฉ๋ชจ๋ฆฌ ์ต์ ํ ์ฐ๊ตฌ ๋ฌธํ
๊ด๋ จ ๋ฌธ์
- CUDA ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ
- ํ ์ ์ฝ์ด ์ํคํ ์ฒ
- NVIDIA GPU ์์ธ
- GPU ๋ฉ๋ชจ๋ฆฌ ์ํคํ ์ฒ ๊ธฐ์ด
- ํผํฉ ์ ๋ฐ๋ ํ๋์จ์ด
- AI ๊ฐ์๊ธฐ ๊ฐ์
- ROCm ์์ธ
ํต์ฌ ์ ๋ฆฌ
- CUDA๋ NVIDIA GPU์ ๋ฒ์ฉ ๋ณ๋ ฌ ์ฐ์ฐ ๋ฅ๋ ฅ์ ํ๋ก๊ทธ๋๋ฐํ ์ ์๋ ํ๋ซํผ์ผ๋ก, ์ค๋ ๋ ๋ธ๋ก/๊ทธ๋ฆฌ๋/์ํ์ ๊ณ์ธต์ ์ธ ํ๋ก๊ทธ๋๋ฐ ๋ชจ๋ธ์ ์ ๊ณตํ๋ค.
- SM(Streaming Multiprocessor)์ CUDA์ ํต์ฌ ์ฐ์ฐ ์ ๋์ผ๋ก, ์ํ ์ค์ผ์ค๋ฌ, ๋ ์ง์คํฐ ํ์ผ, ๊ณต์ ๋ฉ๋ชจ๋ฆฌ, ์ฐ์ฐ ํ์ดํ๋ฅผ ํจ๊ป ์ ๊ณตํ๋ค.
- CUDA ๋ฉ๋ชจ๋ฆฌ ๊ณ์ธต์ ๋ ์ง์คํฐ, ๊ณต์ ๋ฉ๋ชจ๋ฆฌ, ๊ธ๋ก๋ฒ ๋ฉ๋ชจ๋ฆฌ ๋ฑ์ผ๋ก ๊ตฌ์ฑ๋๋ฉฐ, ๊ฐ๊ฐ ๋ค๋ฅธ ์ ๊ทผ ์๋์ ๋ฒ์๋ฅผ ๊ฐ์ง๋ค.
- ํจ์จ์ ์ธ CUDA ํ๋ก๊ทธ๋๋ฐ์ ์ํด์๋ ๋ฉ๋ชจ๋ฆฌ Coalescing, ๊ณต์ ๋ฉ๋ชจ๋ฆฌ ๋ฑ ํฌ ์ปจํ๋ฆญํธ ํํผ, ์ํ ์ค์ผ์ค๋ง ํ์ฉ์ด ์ค์ํ๋ค.
- CUDA๋ ์ง์์ ์ผ๋ก ๋ฐ์ ํ์ฌ TMA, ๋ถ์ฐ ๊ณต์ ๋ฉ๋ชจ๋ฆฌ, WGMMA ๋ฑ ์๋ก์ด ๊ธฐ๋ฅ์ ์ถ๊ฐํ๋ฉฐ AI/HPC ์ํฌ๋ก๋์ ์ฑ๋ฅ์ ํฅ์์ํค๊ณ ์๋ค.