์ฑ๋ฅ: ๋ณํฉ vs ๋น๋ณํฉ ๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ
๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ ํจํด์ ์ดํดํ๋ ๊ฒ์ GPU ์ฑ๋ฅ ์ต์ ํ์ ํต์ฌ์ ๋๋ค. ์ด ์น์ ์์๋ ์๋ฒ ๋ฉ ์กฐํ์ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ๋ฐ์ด๋ ์ฐ์ฐ์์ ๋ณํฉ ๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ ํจํด์ด ์ ๋น๋ณํฉ ํจํด๋ณด๋ค ๋ฐ์ด๋ ์ฑ๋ฅ์ ๋ณด์ด๋์ง ์ค๋ช ํฉ๋๋ค.
๋ฉ๋ชจ๋ฆฌ ๋ณํฉ ๊ธฐ์ด
๋ฉ๋ชจ๋ฆฌ ๋ณํฉ์ ์ํ ๋ด ์ฐ์๋ ์ค๋ ๋๊ฐ ์ฐ์๋ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์์ ์ ๊ทผํ ๋ ๋ฐ์ํฉ๋๋ค. GPU๋ ์ด๋ฌํ ๊ฐ๋ณ ๋ฉ๋ชจ๋ฆฌ ์์ฒญ์ ๋ ์ ์ ์์ ๋์ฉ๋ ๋ฉ๋ชจ๋ฆฌ ํธ๋์ญ์ ์ผ๋ก ๊ฒฐํฉํ์ฌ ๋์ญํญ ํ์ฉ๋๋ฅผ ํฌ๊ฒ ํฅ์์ํต๋๋ค.
๋ณํฉ vs ๋น๋ณํฉ ์ ๊ทผ
๋ณํฉ (ํจ์จ์ ):
- Thread 0 โ Address 0x1000
- Thread 1 โ Address 0x1004
- Thread 2 โ Address 0x1008
- Thread 3 โ Address 0x100C
- ...
๊ฒฐ๊ณผ: ์ํ ์ ์ฒด(32๊ฐ ์ค๋ ๋)์ ๋ํด 1๋ฒ์ ๋ฉ๋ชจ๋ฆฌ ํธ๋์ญ์
๋น๋ณํฉ (๋นํจ์จ์ ):
- Thread 0 โ Address 0x1000
- Thread 1 โ Address 0x2000
- Thread 2 โ Address 0x3000
- Thread 3 โ Address 0x4000
- ...
๊ฒฐ๊ณผ: ์ต๋ 32๋ฒ์ ๊ฐ๋ณ ๋ฉ๋ชจ๋ฆฌ ํธ๋์ญ์
์๋ฒ ๋ฉ ์ฐ์ฐ์ด ๋ฉ๋ชจ๋ฆฌ ๋ฐ์ด๋์ธ ์ด์
์๋ฒ ๋ฉ ์กฐํ๋ ๋ค์๊ณผ ๊ฐ์ ํน์ฑ ๋๋ฌธ์ ๋ฉ๋ชจ๋ฆฌ ๋ฐ์ด๋์ ๋๋ค:
- ์ต์ํ์ ์ฐ์ฐ: ํ๋ ์ผ์ด๋ผ๊ณค ์ ๋ ฅ ๋ฐ์ดํฐ๋ฅผ ์ถ๋ ฅ์ผ๋ก ๋ณต์ฌํ๋ ๊ฒ๋ฟ
- ํฐ ๋ฉ๋ชจ๋ฆฌ ํํ๋ฆฐํธ: ์๋ฒ ๋ฉ ํ ์ด๋ธ์ ์ ๊ธฐ๊ฐ๋ฐ์ดํธ์ ๋ฌํ ์ ์์
- ๋์ ๋ฉ๋ชจ๋ฆฌ ๋์ญํญ ์๊ตฌ: ๋๋์ ๋ฐ์ดํฐ ์ ์ก์ด ํ์
์ด๋ฌํ ์ฐ์ฐ์์๋ ์ฐ์ฐ ๋ณต์ก๋๋ณด๋ค ๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ ํจ์จ์ด ์ฑ๋ฅ์ ๊ฒฐ์ ํฉ๋๋ค.
์ปค๋ ๋น๊ต
1D ๋ณํฉ ์ปค๋
- ์ค๋ ๋ ๊ตฌ์ฑ:
[total_elements // 256]๋ธ๋ก, ์ถ๋ ฅ ์์๋น ํ๋์ ์ค๋ ๋ - ๋ฉ๋ชจ๋ฆฌ ํจํด: ์ฐ์๋ ์ค๋ ๋๊ฐ ์ฐ์๋ ์๋ฒ ๋ฉ ์ฐจ์์ ์ ๊ทผ
- ์ ๋ณํฉ๋๋๊ฐ:
Thread 0: output[0,0,0],Thread 1: output[0,0,1]โ ์ฐ์๋ ์ฃผ์
2D ๋น๋ณํฉ ์ปค๋
- ์ค๋ ๋ ๊ตฌ์ฑ:
[batch*seq // 16, embed_dim // 16]๋ธ๋ก, 16ร16 ์ค๋ ๋ - ๋ฉ๋ชจ๋ฆฌ ํจํด: ์ค๋ ๋๋ค์ด ์๋ก ๋ค๋ฅธ ์๋ฒ ๋ฉ ๋ฒกํฐ์ ์ ๊ทผํ ์ ์์
- ์ ๋น๋ณํฉ์ธ๊ฐ: ์ค๋ ๋ ์ ๊ทผ ํจํด์ด ๋ฉ๋ชจ๋ฆฌ ์ ์ฒด์ ํฉ์ด์ง ์ ์์
์ฑ๋ฅ ๊ฒฐ๊ณผ
์ผ๋ฐ์ ์ธ ๋ฒค์น๋งํฌ ๊ฒฐ๊ณผ:
Performance Results:
1D Coalesced: 2.145 ms
2D Non-coalesced: 3.867 ms
1D is 1.80x faster than 2D
๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ ์๊ฐํ
๋ณํฉ ํจํด (1D ์ปค๋)
output[0,0,0:32]์ ๋ํ ์ํ ์คํ:
| ์์ | ์ค๋ ๋ ID | ๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ | ์ฃผ์ ํจํด |
|---|---|---|---|
output[0,0,0] | 0 | [0,0] | Base + 0 |
output[0,0,1] | 1 | [0,1] | Base + 4 |
output[0,0,2] | 2 | [0,2] | Base + 8 |
output[0,0,3] | 3 | [0,3] | Base + 12 |
| โฆ | โฆ | โฆ | โฆ |
output[0,0,31] | 31 | [0,31] | Base + 124 |
๊ฒฐ๊ณผ: ์ฐ์๋ ์ฃผ์ โ ์ํ ์ ์ฒด์ ๋ํด 1๋ฒ์ ๋ฉ๋ชจ๋ฆฌ ํธ๋์ญ์
๋น๋ณํฉ ํจํด (2D ์ปค๋)
16ร16 ๋ธ๋ก์ ์ํ ์คํ:
Block organization (16ร16):
X-dim: batch*seq positions (0-15)
Y-dim: embed dimensions (0-15)
Warp threads might access:
Thread 0: batch=0, seq=0, embed=0 โ Address A
Thread 1: batch=0, seq=1, embed=0 โ Address B (different row)
Thread 2: batch=0, seq=2, embed=0 โ Address C (different row)
...
Thread 31: batch=1, seq=15, embed=0 โ Address Z (scattered)
๊ฒฐ๊ณผ: ํฉ์ด์ง ์ฃผ์ โ ์ฌ๋ฌ ๋ฒ์ ๋ฉ๋ชจ๋ฆฌ ํธ๋์ญ์
ํต์ฌ ์ต์ ํ ์ ๋ต
- ๋ฉ๋ชจ๋ฆฌ ๋ฐ์ด๋ ์ฐ์ฐ์์๋ ๊ฐ๋ฅํ ํ 1D ์ธ๋ฑ์ฑ์ ์ ํธํ์ธ์
- ๋ณํฉ์ ์ ๋ฆฌํ๋๋ก ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ์ ๋ ฌํ์ธ์
- ์ปค๋ ์ค๊ณ ์ ๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ ํจํด์ ๊ณ ๋ คํ์ธ์
- ๋ณ๋ชฉ ์ง์ ์ ํ์ ํ๊ธฐ ์ํด ๋ฉ๋ชจ๋ฆฌ ๋์ญํญ์ ํ๋กํ์ผ๋งํ์ธ์
- ์ต์ ํ ํจ๊ณผ๋ฅผ ๊ฒ์ฆํ๊ธฐ ์ํด ๋ฉ๋ชจ๋ฆฌ ๋ฐ์ด๋ ๋ฒค์น๋งํฌ๋ฅผ ํ์ฉํ์ธ์
ํต์ฌ ํต์ฐฐ: ํนํ ์๋ฒ ๋ฉ๊ณผ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ๋ฐ์ด๋ ์ฐ์ฐ์์๋ ์ฐ์ฐ ๋ณต์ก๋๋ณด๋ค ๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ ํจํด์ด GPU ์ฑ๋ฅ์ ๊ฒฐ์ ํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค.