๐ง GPU ์ค๋ ๋ฉ vs SIMD - ์คํ ๊ณ์ธต ๊ตฌ์กฐ ์ดํดํ๊ธฐ
๊ฐ์
์์๋ณ, ํ์ผ๋ง, ๋ฒกํฐํ ํจํด์ ํ๊ตฌํ๋ฉด์ GPU ์ฐ์ฐ์ ๊ตฌ์ฑํ๋ ๋ค์ํ ๋ฐฉ๋ฒ์ ์ดํด๋ณด์์ต๋๋ค. ์ด ์น์ ์์๋ GPU ์ค๋ ๋์ SIMD ์ฐ์ฐ ์ฌ์ด์ ๊ทผ๋ณธ์ ์ธ ๊ด๊ณ๋ฅผ ๋ช ํํ ํฉ๋๋ค. ์ด ๋์ ์๋ก ๋ค๋ฅด์ง๋ง ์ํธ ๋ณด์์ ์ธ ๋ณ๋ ฌ์ฑ ์์ค์ผ๋ก, ์ต์ ์ ์ฑ๋ฅ์ ์ํด ํจ๊ป ๋์ํฉ๋๋ค.
ํต์ฌ ํต์ฐฐ: GPU ์ค๋ ๋๊ฐ ๋ณ๋ ฌ์ฑ์ ๊ตฌ์กฐ๋ฅผ ์ ๊ณตํ๊ณ , SIMD ์ฐ์ฐ์ด ๊ฐ ์ค๋ ๋ ๋ด์์ ๋ฒกํฐํ๋ฅผ ์ ๊ณตํฉ๋๋ค.
ํต์ฌ ๊ฐ๋
GPU ์ค๋ ๋ฉ ๊ณ์ธต ๊ตฌ์กฐ
GPU ์คํ์ ํ๋์จ์ด์ ๋ณต์ก์ฑ์ ์ถ์ํํ๋ ์ ์ ์๋ ๊ณ์ธต ๊ตฌ์กฐ๋ฅผ ๋ฐ๋ฆ ๋๋ค:
GPU Device
โโโ Grid (์ ์ฒด ๋ฌธ์ )
โ โโโ Block 1 (์ค๋ ๋ ๊ทธ๋ฃน, ๊ณต์ ๋ฉ๋ชจ๋ฆฌ)
โ โ โโโ ์ํ 1 (32๊ฐ ์ค๋ ๋, ๋ก์คํ
์คํ)
โ โ โ โโโ Thread 1 โ SIMD ์ฐ์ฐ
โ โ โ โโโ Thread 2 โ SIMD ์ฐ์ฐ
โ โ โ โโโ ... (์ด 32๊ฐ ์ค๋ ๋)
โ โ โโโ ์ํ 2 (32๊ฐ ์ค๋ ๋)
โ โโโ Block 2 (๋
๋ฆฝ์ ์ธ ๊ทธ๋ฃน)
๐ก ์ฐธ๊ณ : ์ด Part๋ ํจ์ํ ํจํด์ ์ด์ ์ ๋ง์ถ๊ณ ์์ผ๋ฉฐ, ์ํ ๋ ๋ฒจ ํ๋ก๊ทธ๋๋ฐ๊ณผ ๊ณ ๊ธ GPU ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๋ Part VII ์์ ์์ธํ ๋ค๋ฃน๋๋ค.
Mojo๊ฐ ์๋์ผ๋ก ์ฒ๋ฆฌํ๋ ๊ฒ๋ค:
- ๊ทธ๋ฆฌ๋/๋ธ๋ก ๊ตฌ์ฑ: ๋ฌธ์ ํฌ๊ธฐ์ ๋ฐ๋ผ ์๋ ๊ณ์ฐ
- ์ํ ๊ด๋ฆฌ: ํ๋์จ์ด๊ฐ 32๊ฐ ์ค๋ ๋ ๊ทธ๋ฃน์ ํฌ๋ช ํ๊ฒ ์ฒ๋ฆฌ
- ์ค๋ ๋ ์ค์ผ์ค๋ง: GPU ์ค์ผ์ค๋ฌ๊ฐ ์คํ์ ์๋ ๊ด๋ฆฌ
- ๋ฉ๋ชจ๋ฆฌ ๊ณ์ธต ๊ตฌ์กฐ: ํจ์ํ ์ฐ์ฐ์ ์ต์ ์ ์ ๊ทผ ํจํด ๋ด์ฅ
GPU ์ค๋ ๋ ๋ด์ SIMD
๊ฐ GPU ์ค๋ ๋๋ SIMD (Single Instruction, Multiple Data) ์ฐ์ฐ์ ์ฌ์ฉํ์ฌ ์ฌ๋ฌ ๋ฐ์ดํฐ ์์๋ฅผ ๋์์ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค:
# ํ๋์ GPU ์ค๋ ๋ ๋ด๋ถ:
a_simd = a.load[simd_width](idx, 0) # float 4๊ฐ๋ฅผ ๋์์ ๋ก๋
b_simd = b.load[simd_width](idx, 0) # float 4๊ฐ๋ฅผ ๋์์ ๋ก๋
result = a_simd + b_simd # 4์์ ๋์์ ๋ง์
output.store[simd_width](idx, 0, result) # ๊ฒฐ๊ณผ 4๊ฐ๋ฅผ ๋์์ ์ ์ฅ
ํจํด ๋น๊ต์ ์ค๋ ๋-์์ ๋งคํ
ํต์ฌ ์ธ์ฌ์ดํธ: ๋ชจ๋ ํจํด์ ๋์ผํ ์ด ์์ ๋ - SIMD_WIDTH=4๋ก 1024๊ฐ ์์์ ๋ํด 256ํ์ SIMD ์ฐ์ฐ - ์ ์ํํฉ๋๋ค. ์ฐจ์ด์ ์ ์ด ์์ ์ด GPU ์ค๋ ๋์ ์ด๋ป๊ฒ ๋ถ๋ฐฐ๋๋๋์ ์์ต๋๋ค.
์ค๋ ๋ ๊ตฌ์ฑ ๋น๊ต (SIZE=1024, SIMD_WIDTH=4)
| ํจํด | ์ค๋ ๋ ์ | ์ค๋ ๋๋น SIMD ์ฐ์ฐ | ๋ฉ๋ชจ๋ฆฌ ํจํด | ํธ๋ ์ด๋์คํ |
|---|---|---|---|---|
| ์์๋ณ | 256 | 1 | ๋ถ์ฐ ์ ๊ทผ | ์ต๋ ๋ณ๋ ฌ์ฑ, ๋ฎ์ ์ง์ญ์ฑ |
| ํ์ผ๋ง | 32 | 8 | ์ํ ๋ธ๋ก | ๋ณ๋ ฌ์ฑ + ์ง์ญ์ฑ ๊ท ํ |
| ์๋ ๋ฒกํฐํ | 8 | 32 | ๋ํ ์ฒญํฌ | ๋์ ๋์ญํญ, ์ ์ ์ค๋ ๋ |
| Mojo vectorize | 32 | 8 | ์ค๋งํธ ๋ธ๋ก | ์๋ ์ต์ ํ |
์์ธ ์คํ ํจํด
์์๋ณ ํจํด:
Thread 0: [0,1,2,3] โ Thread 1: [4,5,6,7] โ ... โ Thread 255: [1020,1021,1022,1023]
256 ์ค๋ ๋ ร 1 SIMD ์ฐ์ฐ = ์ด 256ํ SIMD ์ฐ์ฐ
ํ์ผ๋ง ํจํด:
Thread 0: [0:32] (8 SIMD) โ Thread 1: [32:64] (8 SIMD) โ ... โ Thread 31: [992:1024] (8 SIMD)
32 ์ค๋ ๋ ร 8 SIMD ์ฐ์ฐ = ์ด 256ํ SIMD ์ฐ์ฐ
์๋ ๋ฒกํฐํ ํจํด:
Thread 0: [0:128] (32 SIMD) โ Thread 1: [128:256] (32 SIMD) โ ... โ Thread 7: [896:1024] (32 SIMD)
8 ์ค๋ ๋ ร 32 SIMD ์ฐ์ฐ = ์ด 256ํ SIMD ์ฐ์ฐ
Mojo vectorize ํจํด:
Thread 0: [0:32] ์๋ ๋ฒกํฐํ โ Thread 1: [32:64] ์๋ ๋ฒกํฐํ โ ... โ Thread 31: [992:1024] ์๋ ๋ฒกํฐํ
32 ์ค๋ ๋ ร 8 SIMD ์ฐ์ฐ = ์ด 256ํ SIMD ์ฐ์ฐ
์ฑ๋ฅ ํน์ฑ๊ณผ ํธ๋ ์ด๋์คํ
ํต์ฌ ํธ๋ ์ด๋์คํ ์์ฝ
| ์ธก๋ฉด | ์ค๋ ๋ ๋ง์ (์์๋ณ) | ์ค๋ ๋ ์ค๊ฐ (ํ์ผ๋ง/vectorize) | ์ค๋ ๋ ์ ์ (์๋) |
|---|---|---|---|
| ๋ณ๋ ฌ์ฑ | ์ต๋ ์ง์ฐ ์๊ฐ ์๋ | ๊ท ํ ์กํ ์ ๊ทผ | ์ต์ํ์ ๋ณ๋ ฌ์ฑ |
| ์บ์ ์ง์ญ์ฑ | ์ค๋ ๋ ๊ฐ ๋ฎ์ | ํ์ผ ๋ด์์ ์ํธ | ์์ฐจ ์ ๊ทผ์ผ๋ก ์ฐ์ |
| ๋ฉ๋ชจ๋ฆฌ ๋์ญํญ | ์ํธํ ๋ณํฉ | ์ํธ + ์บ์ ์ฌ์ฌ์ฉ | ์ด๋ก ์ ์ต๋๊ฐ |
| ๋ณต์ก๋ | ๊ฐ์ฅ ๋จ์ | ๋ณดํต | ๊ฐ์ฅ ๋ณต์ก |
๊ฐ ํจํด์ ์ ํ ๊ธฐ์ค
์์๋ณ ํจํด์ ์ฌ์ฉํ ๋:
- ์์๋น ์ฐ์ฐ๋์ด ์ ์ ๋จ์ํ ์ฐ์ฐ
- ์ง์ฐ ์๊ฐ ์๋์ ์ํด ์ต๋ ๋ณ๋ ฌ์ฑ์ด ํ์ํ ๊ฒฝ์ฐ
- ๋ค์ํ ๋ฌธ์ ํฌ๊ธฐ์ ๋ํ ํ์ฅ์ฑ์ด ์ค์ํ ๊ฒฝ์ฐ
ํ์ผ๋ง/vectorize๋ฅผ ์ฌ์ฉํ ๋:
- ๋ฐ์ดํฐ ์ฌ์ฌ์ฉ์ ์ด์ ์ด ์๋ ์บ์ ๋ฏผ๊ฐ ์ฐ์ฐ
- ์ฑ๋ฅ๊ณผ ์ ์ง๋ณด์์ฑ์ ๊ท ํ์ด ํ์ํ ๊ฒฝ์ฐ
- ์๋ ์ต์ ํ(vectorize)๊ฐ ์ ํธ๋๋ ๊ฒฝ์ฐ
์๋ ๋ฒกํฐํ๋ฅผ ์ฌ์ฉํ ๋:
- ๋ฉ๋ชจ๋ฆฌ ํจํด์ ๋ํ ์ ๋ฌธ๊ฐ ์์ค์ ์ ์ด๊ฐ ํ์ํ ๊ฒฝ์ฐ
- ์ต๋ ๋ฉ๋ชจ๋ฆฌ ๋์ญํญ ํ์ฉ์ด ์ค์ํ ๊ฒฝ์ฐ
- ๊ฐ๋ฐ ๋ณต์ก๋๋ฅผ ๊ฐ์ํ ์ ์๋ ๊ฒฝ์ฐ
ํ๋์จ์ด ๊ณ ๋ ค ์ฌํญ
ํ๋ GPU ์ํคํ ์ฒ์๋ Mojo๊ฐ ์ถ์ํํ๋ ์ฌ๋ฌ ์์ค์ด ์์ต๋๋ค:
ํ๋์จ์ด ์ค์ ๊ตฌ์กฐ:
- ์ํ: 32๊ฐ ์ค๋ ๋๊ฐ ๋ก์คํ ์ผ๋ก ์คํ
- Streaming Multiprocessor (SM): ์ฌ๋ฌ ์ํ๊ฐ ๋์์ ์คํ
- SIMD ์ ๋: ๊ฐ SM ๋ด์ ๋ฒกํฐ ์ฒ๋ฆฌ ์ ๋
- ๋ฉ๋ชจ๋ฆฌ ๊ณ์ธต ๊ตฌ์กฐ: L1/L2 ์บ์, ๊ณต์ ๋ฉ๋ชจ๋ฆฌ, ์ ์ญ ๋ฉ๋ชจ๋ฆฌ
Mojo ์ถ์ํ์ ์ด์ :
- ์ํ ์ ๋ ฌ๊ณผ ์ค์ผ์ค๋ง์ ์๋์ผ๋ก ์ฒ๋ฆฌ
- ๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ ํจํด์ ํฌ๋ช ํ๊ฒ ์ต์ ํ
- SM ๊ฐ ๋ฆฌ์์ค ํ ๋น์ ๊ด๋ฆฌ
- GPU ๋ฒค๋ ๊ฐ ์ด์ ๊ฐ๋ฅํ ์ฑ๋ฅ ์ ๊ณต
์ฑ๋ฅ์ ๋ํ ์ฌ๊ณ ๋ชจ๋ธ
GPU ํ๋ก๊ทธ๋๋ฐ์ ๋ ๊ฐ์ง ์ํธ ๋ณด์์ ์ธ ๋ณ๋ ฌ์ฑ ์ ํ์ ๊ด๋ฆฌํ๋ ๊ฒ์ผ๋ก ์๊ฐํ์ธ์:
์ค๋ ๋ ์์ค ๋ณ๋ ฌ์ฑ:
- ๋ณ๋ ฌ ๊ตฌ์กฐ๋ฅผ ์ ๊ณต (์คํ ์ ๋์ ์)
- ๋์ ์คํ์ ํตํ ์ง์ฐ ์๊ฐ ์๋ ๊ฐ๋ฅ
- GPU ์ค์ผ์ค๋ฌ๊ฐ ์๋์ผ๋ก ๊ด๋ฆฌ
SIMD ์์ค ๋ณ๋ ฌ์ฑ:
- ๊ฐ ์ค๋ ๋ ๋ด์์ ๋ฒกํฐํ๋ฅผ ์ ๊ณต
- ์ค๋ ๋๋น ์ฐ์ ์ฒ๋ฆฌ๋์ ๊ทน๋ํ
- ๋ฒกํฐ ์ฒ๋ฆฌ ์ ๋์ ํจ์จ์ ์ผ๋ก ํ์ฉ
์ต์ ์ฑ๋ฅ ๊ณต์:
์ฑ๋ฅ = (์ง์ฐ ์๊ฐ ์๋์ ์ํ ์ถฉ๋ถํ ์ค๋ ๋) ร
(ํจ์จ์ ์ธ SIMD ํ์ฉ) ร
(์ต์ ์ ๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ ํจํด)
ํ์ฅ์ฑ ๊ณ ๋ ค ์ฌํญ
| ๋ฌธ์ ํฌ๊ธฐ | ์ต์ ํจํด | ๊ทผ๊ฑฐ |
|---|---|---|
| ์๊ท๋ชจ (< 1K) | ํ์ผ๋ง/vectorize | ๋ฎ์ ์คํ ์ค๋ฒํค๋ |
| ์ค๊ท๋ชจ (1K-1M) | ๋ชจ๋ ํจํด | ์ ์ฌํ ์ฑ๋ฅ |
| ๋๊ท๋ชจ (> 1M) | ๋ณดํต ์์๋ณ | ๋ณ๋ ฌ์ฑ์ด ์ง๋ฐฐ์ |
์ต์ ์ ์ ํ์ ํน์ ํ๋์จ์ด, ์ํฌ๋ก๋ ๋ณต์ก๋, ๊ฐ๋ฐ ์ ์ฝ ์กฐ๊ฑด์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋๋ค.
๋ค์ ๋จ๊ณ
GPU ์ค๋ ๋ฉ vs SIMD ๊ฐ๋ ์ ํ์คํ ์ดํดํ๋ค๋ฉด:
- ๐ Mojo ๋ฒค์น๋งํน: ์ค์ ์ฑ๋ฅ์ ์ธก์ ํ๊ณ ๋น๊ต
๐ก ํต์ฌ ์์ฝ: GPU ์ค๋ ๋์ SIMD ์ฐ์ฐ์ ์ํธ ๋ณด์์ ์ธ ๋ณ๋ ฌ์ฑ ์์ค์ผ๋ก ํจ๊ป ๋์ํฉ๋๋ค. ์ด ๋์ ๊ด๊ณ๋ฅผ ์ดํดํ๋ฉด ๊ตฌ์ฒด์ ์ธ ์ฑ๋ฅ ์๊ตฌ ์ฌํญ๊ณผ ์ ์ฝ ์กฐ๊ฑด์ ๋ง๋ ์ฌ๋ฐ๋ฅธ ํจํด์ ์ ํํ ์ ์์ต๋๋ค.