๐ ๊ณต์ ๋ฉ๋ชจ๋ฆฌ ๋ฑ ํฌ ์ดํดํ๊ธฐ
์ง๊ธ๊น์ง ๋ฐฐ์ด ๊ฒ์ ๋ฐํ์ผ๋ก
GPU ์ต์ ํ ์ฌ์ ์์ ์ด๋ฏธ ๋ง์ ๊ธธ์ ๊ฑธ์ด์์ต๋๋ค. Puzzle 8์์๋ ๊ณต์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์ ์ญ ๋ฉ๋ชจ๋ฆฌ๋ณด๋ค ํจ์ฌ ๋น ๋ฅธ ๋ธ๋ก ๋ด๋ถ ์ ์ฅ์๋ฅผ ์ ๊ณตํ๋ค๋ ๊ฒ์ ๋ฐฐ์ ์ต๋๋ค. Puzzle 16์์๋ ํ๋ ฌ ๊ณฑ์ ์ปค๋์ด ๊ณต์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ ํ์ผ์ ์บ์ฑํ๊ณ , ๋น์ฉ์ด ํฐ ์ ์ญ ๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ์ ์ค์ด๋ ๋ฐฉ๋ฒ์ ํ์ธํ์ต๋๋ค.
ํ์ง๋ง ๊ณต์ ๋ฉ๋ชจ๋ฆฌ์๋ ๋ณ๋ ฌ ์ฐ์ฐ์ ์ง๋ ฌํ์ํฌ ์ ์๋ ์จ๊ฒจ์ง ์ฑ๋ฅ ํจ์ ์ด ๋์ฌ๋ฆฌ๊ณ ์์ต๋๋ค: ๋ฑ ํฌ ์ถฉ๋.
์ฑ๋ฅ ๋ฏธ์คํฐ๋ฆฌ: ๊ฒ๋ณด๊ธฐ์ ๋์ผํ ๋ฐฉ์์ผ๋ก ๊ณต์ ๋ฉ๋ชจ๋ฆฌ์ ์ ๊ทผํ๋ ๋ ์ปค๋์ ์์ฑํ ์ ์์ต๋๋ค - ๋ ๋ค ๊ฐ์ ์์ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ๊ณ , ์๋ฒฝํ ์ ์ ์จ์ ๊ฐ์ง๋ฉฐ, ๊ฒฝ์ ์ํ๋ ์์ต๋๋ค. ๊ทธ๋ฐ๋ฐ ํ๋๊ฐ ๋ค๋ฅธ ๊ฒ๋ณด๋ค 32๋ฐฐ ๋๋ฆฝ๋๋ค. ๋ฒ์ธ์? ์ค๋ ๋๊ฐ ๊ณต์ ๋ฉ๋ชจ๋ฆฌ ๋ฑ ํฌ์ ์ ๊ทผํ๋ ๋ฐฉ์์ ๋๋ค.
๊ณต์ ๋ฉ๋ชจ๋ฆฌ ๋ฑ ํฌ๋?
๊ณต์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ฑ ํฌ๋ผ๊ณ ๋ถ๋ฆฌ๋ 32๊ฐ์ ๋ ๋ฆฝ์ ์ธ ๋ฉ๋ชจ๋ฆฌ ์ ๋์ ์งํฉ์ด๋ผ๊ณ ์๊ฐํ์ธ์. ๊ฐ ๋ฑ ํฌ๋ ํด๋ก ์ฌ์ดํด๋น ํ๋์ ๋ฉ๋ชจ๋ฆฌ ์์ฒญ์ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค. ์ด ๋ฑ ํน ์์คํ ์ด ์กด์ฌํ๋ ๊ทผ๋ณธ์ ์ธ ์ด์ ๋ ํ๋์จ์ด ๋ณ๋ ฌ์ฑ ๋๋ฌธ์ ๋๋ค.
32๊ฐ ์ค๋ ๋๋ก ๊ตฌ์ฑ๋ ์ํ๊ฐ ๋์์ ๊ณต์ ๋ฉ๋ชจ๋ฆฌ์ ์ ๊ทผํด์ผ ํ ๋, ๊ฐ ์ค๋ ๋๊ฐ ์๋ก ๋ค๋ฅธ ๋ฑ ํฌ์ ์ ๊ทผํ๋ค๋ฉด GPU๋ 32๊ฐ์ ์์ฒญ์ ๋ชจ๋ ๋ณ๋ ฌ๋ก ์ฒ๋ฆฌํ ์ ์์ต๋๋ค. ์ฌ๋ฌ ์ค๋ ๋๊ฐ ๊ฐ์ ๋ฑ ํฌ์ ์ ๊ทผํ๋ ค ํ๋ฉด ํ๋์จ์ด๋ ์ด๋ฅผ ์ง๋ ฌํํด์ผ ํ๋ฏ๋ก, 1์ฌ์ดํด์ด๋ฉด ๋ ์ฐ์ฐ์ด ์ฌ๋ฌ ์ฌ์ดํด๋ก ๋์ด๋ฉ๋๋ค.
๋ฑ ํฌ ์ฃผ์ ๋งคํ
๊ณต์ ๋ฉ๋ชจ๋ฆฌ์ ๊ฐ 4๋ฐ์ดํธ ์๋๋ ๋ค์ ๊ณต์์ ๋ฐ๋ผ ํน์ ๋ฑ ํฌ์ ๋ฐฐ์ ๋ฉ๋๋ค:
bank_id = (byte_address / 4) % 32
๊ณต์ ๋ฉ๋ชจ๋ฆฌ์ ์ฒ์ 128๋ฐ์ดํธ๊ฐ ๋ฑ ํฌ์ ๋งคํ๋๋ ๋ฐฉ์์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
| Address Range | Bank ID | Example float32 Elements |
|---|---|---|
| 0-3 bytes | Bank 0 | shared[0] |
| 4-7 bytes | Bank 1 | shared[1] |
| 8-11 bytes | Bank 2 | shared[2] |
| โฆ | โฆ | โฆ |
| 124-127 bytes | Bank 31 | shared[31] |
| 128-131 bytes | Bank 0 | shared[32] |
| 132-135 bytes | Bank 1 | shared[33] |
ํต์ฌ ํต์ฐฐ: float32 ๋ฐฐ์ด์์ ๋ฑ
ํน ํจํด์ 32๊ฐ ์์๋ง๋ค ๋ฐ๋ณต๋๋ฉฐ, ์ด๋ 32๊ฐ ์ค๋ ๋๋ก ๊ตฌ์ฑ๋ ์ํ ํฌ๊ธฐ์ ์ ํํ ์ผ์นํฉ๋๋ค. ์ด๊ฒ์ ์ฐ์ฐ์ด ์๋๋๋ค - ์ต์ ์ ๋ณ๋ ฌ ์ ๊ทผ์ ์ํด ์ค๊ณ๋ ๊ฒ์
๋๋ค.
๋ฑ ํฌ ์ถฉ๋์ ์ ํ
์ถฉ๋ ์์: ์ด์์ ์ธ ๊ฒฝ์ฐ
์ํ ๋ด ๊ฐ ์ค๋ ๋๊ฐ ์๋ก ๋ค๋ฅธ ๋ฑ ํฌ์ ์ ๊ทผํ๋ฉด 32๊ฐ์ ์ ๊ทผ์ด ๋ชจ๋ 1์ฌ์ดํด์ ์๋ฃ๋ฉ๋๋ค:
# Perfect case: each thread accesses a different bank
shared[thread_idx.x] # Thread 0โBank 0, Thread 1โBank 1, ..., Thread 31โBank 31
๊ฒฐ๊ณผ: 32๊ฐ ๋ณ๋ ฌ ์ ๊ทผ, ์ด 1์ฌ์ดํด
N-way ๋ฑ ํฌ ์ถฉ๋
N๊ฐ์ ์ค๋ ๋๊ฐ ๊ฐ์ ๋ฑ ํฌ์ ์๋ก ๋ค๋ฅธ ์ฃผ์์ ์ ๊ทผํ๋ฉด ํ๋์จ์ด๊ฐ ์ ๊ทผ์ ์ง๋ ฌํํฉ๋๋ค:
# 2-way conflict: stride-2 access pattern
shared[thread_idx.x * 2] # Thread 0,16โBank 0; Thread 1,17โBank 1; etc.
๊ฒฐ๊ณผ: ๋ฑ ํฌ๋น 2ํ ์ ๊ทผ, ์ด 2์ฌ์ดํด (ํจ์จ 50%)
# Worst case: all threads access different addresses in Bank 0
shared[thread_idx.x * 32] # All threadsโBank 0
๊ฒฐ๊ณผ: 32ํ ์ง๋ ฌํ๋ ์ ๊ทผ, ์ด 32์ฌ์ดํด (ํจ์จ 3%)
๋ธ๋ก๋์บ์คํธ ์์ธ
์ถฉ๋ ๊ท์น์๋ ํ ๊ฐ์ง ์ค์ํ ์์ธ๊ฐ ์์ต๋๋ค: ๋ธ๋ก๋์บ์คํธ ์ ๊ทผ. ๋ชจ๋ ์ค๋ ๋๊ฐ ๋์ผํ ์ฃผ์๋ฅผ ์ฝ์ผ๋ฉด ํ๋์จ์ด๊ฐ ์ด๋ฅผ ๋จ์ผ ๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ์ผ๋ก ์ต์ ํํฉ๋๋ค:
# Broadcast: all threads read the same value
constant = shared[0] # All threads read shared[0]
๊ฒฐ๊ณผ: 1ํ ์ ๊ทผ์ผ๋ก 32๊ฐ ์ค๋ ๋์ ๋ธ๋ก๋์บ์คํธ, ์ด 1์ฌ์ดํด
์ด ์ต์ ํ๊ฐ ์กด์ฌํ๋ ์ด์ ๋ ๋ธ๋ก๋์บ์คํธ๊ฐ ํํ ํจํด(์์ ๋ก๋ฉ, ๋ฆฌ๋์ ์ฐ์ฐ ๋ฑ)์ด๊ณ , ํ๋์จ์ด๊ฐ ์ถ๊ฐ ๋ฉ๋ชจ๋ฆฌ ๋์ญํญ ์์ด ๋จ์ผ ๊ฐ์ ๋ชจ๋ ์ค๋ ๋์ ๋ณต์ ํ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
๋ฑ ํฌ ์ถฉ๋์ด ์ค์ํ ์ด์
์ฑ๋ฅ ์ํฅ
๋ฑ ํฌ ์ถฉ๋์ ๊ณต์ ๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ ์๊ฐ์ ์ง์ ์ ์ผ๋ก ๋ฐฐ๊ฐ์ํต๋๋ค:
| ์ถฉ๋ ์ ํ | ์ ๊ทผ ์๊ฐ | ํจ์จ | ์ฑ๋ฅ ์ํฅ |
|---|---|---|---|
| ์ถฉ๋ ์์ | 1์ฌ์ดํด | 100% | ๊ธฐ์ค์ |
| 2-way conflict | 2์ฌ์ดํด | 50% | 2๋ฐฐ ๋๋ฆผ |
| 4-way conflict | 4์ฌ์ดํด | 25% | 4๋ฐฐ ๋๋ฆผ |
| 32-way conflict | 32์ฌ์ดํด | 3% | 32๋ฐฐ ๋๋ฆผ |
์ค์ ๋งฅ๋ฝ
Puzzle 30์์ ๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ ํจํด์ด ๊ทน์ ์ธ ์ฑ๋ฅ ์ฐจ์ด๋ฅผ ๋ง๋ค์ด๋ธ๋ค๋ ๊ฒ์ ๋ฐฐ์ ์ต๋๋ค. ๋ฑ ํฌ ์ถฉ๋์ ์ด ์๋ฆฌ๊ฐ ๊ณต์ ๋ฉ๋ชจ๋ฆฌ ์์ค์์ ์๋ํ๋ ๋ ๋ค๋ฅธ ์ฌ๋ก์ ๋๋ค.
์ ์ญ ๋ฉ๋ชจ๋ฆฌ ๋ณํฉ์ด DRAM ๋์ญํญ ํ์ฉ์ ์ํฅ์ ์ฃผ๋ ๊ฒ์ฒ๋ผ, ๋ฑ ํฌ ์ถฉ๋์ ๊ณต์ ๋ฉ๋ชจ๋ฆฌ ์ฒ๋ฆฌ๋์ ์ํฅ์ ์ค๋๋ค. ์ฐจ์ด๋ ๊ท๋ชจ์ ์์ต๋๋ค: ์ ์ญ ๋ฉ๋ชจ๋ฆฌ ์ง์ฐ ์๊ฐ์ ์๋ฐฑ ์ฌ์ดํด์ด์ง๋ง, ๊ณต์ ๋ฉ๋ชจ๋ฆฌ ์ถฉ๋์ ์ ๊ทผ๋น ๋ช ์ฌ์ดํด๋ง ์ถ๊ฐํฉ๋๋ค. ๊ทธ๋ฌ๋ ๊ณต์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ง์ค์ ์ผ๋ก ์ฌ์ฉํ๋ ์ฐ์ฐ ์ง์ฝ์ ์ปค๋์์๋ ์ด โ๋ช ์ฌ์ดํดโ์ด ๋น ๋ฅด๊ฒ ๋์ ๋ฉ๋๋ค.
์ํ ์คํ๊ณผ์ ๊ด๊ณ
Puzzle 24์์ ์ํ๊ฐ SIMT(Single Instruction, Multiple Thread) ๋ฐฉ์์ผ๋ก ์คํ๋๋ค๋ ๊ฒ์ ๋ฐฐ์ ์ต๋๋ค. ์ํ๊ฐ ๋ฑ ํฌ ์ถฉ๋์ ๋ถ๋ชํ๋ฉด ์ง๋ ฌํ๋ ๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ์ด ์๋ฃ๋ ๋๊น์ง 32๊ฐ ์ค๋ ๋ ๋ชจ๋๊ฐ ๋๊ธฐํด์ผ ํฉ๋๋ค. ์ด ๋๊ธฐ ์๊ฐ์ ์ถฉ๋์ ์ผ์ผํจ ์ค๋ ๋๋ง์ด ์๋๋ผ ์ํ ์ ์ฒด์ ์งํ์ ์ํฅ์ ๋ฏธ์นฉ๋๋ค.
์ด๋ Puzzle 31์ ์ ์ ์จ ๊ฐ๋ ๊ณผ ์ฐ๊ฒฐ๋ฉ๋๋ค: ๋ฑ ํฌ ์ถฉ๋์ ์ํ๊ฐ ๋ฉ๋ชจ๋ฆฌ ์ง์ฐ ์๊ฐ์ ํจ๊ณผ์ ์ผ๋ก ์จ๊ธฐ๋ ๊ฒ์ ๋ฐฉํดํ์ฌ, ๋์ ์ ์ ์จ์ ์ค์ง์ ์ธ ์ด์ ์ ์ค์ผ ์ ์์ต๋๋ค.
๋ฑ ํฌ ์ถฉ๋ ๊ฐ์งํ๊ธฐ
์๊ฐ์ ํจํด ์ธ์
์ ๊ทผ ํจํด์ ๋ถ์ํ๋ฉด ๋ฑ ํฌ ์ถฉ๋์ ์์ธกํ ์ ์๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค:
์์ฐจ ์ ๊ทผ (์ถฉ๋ ์์):
# Thread ID: 0 1 2 3 ... 31
# Address: 0 4 8 12 ... 124
# Bank: 0 1 2 3 ... 31 โ
All different banks
Stride-2 ์ ๊ทผ (2-way conflict):
# Thread ID: 0 1 2 3 ... 15 16 17 18 ... 31
# Address: 0 8 16 24 ... 120 4 12 20 ... 124
# Bank: 0 2 4 6 ... 30 1 3 5 ... 31
# Conflict: Banks 0,2,4... have 2 threads each โ
Stride-32 ์ ๊ทผ (32-way conflict):
# Thread ID: 0 1 2 3 ... 31
# Address: 0 128 256 384 ... 3968
# Bank: 0 0 0 0 ... 0 โ All threadsโBank 0
NSight Compute(ncu)๋ฅผ ์ฌ์ฉํ ํ๋กํ์ผ๋ง
Puzzle 30์์ ๋ฐฐ์ด ํ๋กํ์ผ๋ง ๋ฐฉ๋ฒ๋ก ์ ๋ฐํ์ผ๋ก, ๋ฑ ํฌ ์ถฉ๋์ ์ ๋์ ์ผ๋ก ์ธก์ ํ ์ ์์ต๋๋ค:
# Key metrics for shared memory bank conflicts
ncu --metrics=l1tex__data_bank_conflicts_pipe_lsu_mem_shared_op_ld,l1tex__data_bank_conflicts_pipe_lsu_mem_shared_op_st your_kernel
# Additional context metrics
ncu --metrics=smsp__sass_average_branch_targets_threads_uniform.pct your_kernel
ncu --metrics=smsp__warps_issue_stalled_membar_per_warp_active.pct your_kernel
l1tex__data_bank_conflicts_pipe_lsu_mem_shared_op_ld์ l1tex__data_bank_conflicts_pipe_lsu_mem_shared_op_st ๋ฉํธ๋ฆญ์ ์ปค๋ ์คํ ์ค ๋ก๋ ๋ฐ ์คํ ์ด ์ฐ์ฐ์ ๋ฑ
ํฌ ์ถฉ๋ ํ์๋ฅผ ์ง์ ์นด์ดํธํฉ๋๋ค. ๊ณต์ ๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ ํ์์ ๊ฒฐํฉํ๋ฉด ์ถฉ๋ ๋น์จ์ ๊ตฌํ ์ ์์ผ๋ฉฐ, ์ด๋ ํต์ฌ์ ์ธ ์ฑ๋ฅ ์งํ์
๋๋ค.
๋ฑ ํฌ ์ถฉ๋์ด ๊ฐ์ฅ ์ค์ํ ๊ฒฝ์ฐ
์ฐ์ฐ ์ง์ฝ์ ์ปค๋
๋ฑ ํฌ ์ถฉ๋์ ๋ค์๊ณผ ๊ฐ์ ์ปค๋์์ ๊ฐ์ฅ ํฐ ์ํฅ์ ๋ฏธ์นฉ๋๋ค:
- ํ์ดํธํ ๋ฃจํ ์์์ ๊ณต์ ๋ฉ๋ชจ๋ฆฌ์ ์์ฃผ ์ ๊ทผํ๋ ๊ฒฝ์ฐ
- ๊ณต์ ๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ๋น ์ฐ์ฐ๋์ด ์ ์ ๊ฒฝ์ฐ
- ์ปค๋์ด ๋ฉ๋ชจ๋ฆฌ ๋ฐ์ด๋๊ฐ ์๋ ์ฐ์ฐ ๋ฐ์ด๋์ธ ๊ฒฝ์ฐ
๋ํ์ ์ธ ์๋๋ฆฌ์ค:
- ํ๋ ฌ ๊ณฑ์ ๋ด๋ถ ๋ฃจํ (Puzzle 16์ ํ์ผ๋ง ๋ฒ์ ๊ณผ ๊ฐ์)
- ๊ณต์ ๋ฉ๋ชจ๋ฆฌ ์บ์ฑ์ ์ฌ์ฉํ๋ ์คํ ์ค ์ฐ์ฐ
- ๋ณ๋ ฌ ๋ฆฌ๋์ ์ฐ์ฐ
๋ฉ๋ชจ๋ฆฌ ๋ฐ์ด๋ vs ์ฐ์ฐ ๋ฐ์ด๋ ํธ๋ ์ด๋์คํ
Puzzle 31์์ ๋ฉ๋ชจ๋ฆฌ ๋ฐ์ด๋ ์ํฌ๋ก๋์์๋ ์ ์ ์จ์ด ๋ ์ค์ํ๋ค๋ ๊ฒ์ ๋ณด์๋ฏ์ด, ์ปค๋์ด ์ ์ญ ๋ฉ๋ชจ๋ฆฌ ๋์ญํญ์ ๋ณ๋ชฉ์ด ๊ฑธ๋ฆฌ๊ฑฐ๋ ์ฐ์ ๊ฐ๋๊ฐ ๋งค์ฐ ๋ฎ์ ๊ฒฝ์ฐ์๋ ๋ฑ ํฌ ์ถฉ๋์ ์ํฅ๋ ์ค์ด๋ญ๋๋ค.
๊ทธ๋ฌ๋ ๊ณต์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ๋ง์ ์ปค๋์ ๋ฐ๋ก ๋ฉ๋ชจ๋ฆฌ ๋ฐ์ด๋์์ ์ฐ์ฐ ๋ฐ์ด๋๋ก ์ ํํ๊ธฐ ์ํด ๊ณต์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ์ฉํฉ๋๋ค. ์ด๋ฐ ๊ฒฝ์ฐ ๋ฑ ํฌ ์ถฉ๋์ ์ ์ด์ ๊ณต์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋์ ํ ์ด์ ์๋ ์ฑ๋ฅ ํฅ์์ ๋ฌ์ฑํ์ง ๋ชปํ๊ฒ ๋ง๋ค ์ ์์ต๋๋ค.
์์ผ๋ก์ ๋ฐฉํฅ
๊ณต์ ๋ฉ๋ชจ๋ฆฌ ๋ฑ ํน์ ์ดํดํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ๊ธฐ์ด๋ฅผ ๊ฐ์ถ๊ฒ ๋ฉ๋๋ค:
- ์ ๊ทผ ํจํด์ ๋ถ์ํ์ฌ ์ฝ๋๋ฅผ ์์ฑํ๊ธฐ ์ ์ ์ฑ๋ฅ์ ์์ธก
- ์ฒด๊ณ์ ์ธ ํ๋กํ์ผ๋ง ์ ๊ทผ๋ฒ์ผ๋ก ์ฑ๋ฅ ์ ํ๋ฅผ ์ง๋จ
- ๋์ ๊ณต์ ๋ฉ๋ชจ๋ฆฌ ์ฒ๋ฆฌ๋์ ์ ์งํ๋ ์ถฉ๋ ์๋ ์๊ณ ๋ฆฌ์ฆ ์ค๊ณ
- ์๊ณ ๋ฆฌ์ฆ ๋ณต์ก๋์ ๋ฉ๋ชจ๋ฆฌ ํจ์จ ์ฌ์ด์ ๊ท ํ ์กํ ํ๋จ
๋ค์ ์น์ ์์๋ ์ด ์ง์์ ์ค์ต์ ์ ์ฉํ์ฌ ์ผ๋ฐ์ ์ธ ์ถฉ๋ ํจํด๊ณผ ํด๊ฒฐ์ฑ ์ ์ง์ ๋ค๋ค๋ด ๋๋ค - ์ด๋ก ์ ์ดํด๋ฅผ ์ค์ ์ต์ ํ ์ญ๋์ผ๋ก ๋ฐ๊พธ๋ ๊ณผ์ ์ ๋๋ค.