๐ต ํ์ ์์ฌ: ์ธ ๋ฒ์งธ ์ฌ๋ก
๊ฐ์
๋ฉ๋ชจ๋ฆฌ ํฌ๋์์ ๋ก์ง ๋ฒ๊ทธ ๋๋ฒ๊น ์ ์ตํ์ต๋๋ค. ์ด์ GPU ๋๋ฒ๊น ์ ์ต์ข ๋ณด์ค์ ๋์ ํฉ๋๋ค: ํ๋ก๊ทธ๋จ์ด ๋ฌดํ์ ๋ฉ์ถฐ๋ฒ๋ฆฌ๋ ๋ฐฐ๋ฆฌ์ด ๊ต์ฐฉ ์ํ. ์ค๋ฅ ๋ฉ์์ง๋, ์๋ชป๋ ๊ฒฐ๊ณผ๋ ์์ด - ๊ทธ์ ๋์๋ ์นจ๋ฌต๋ง ์์ต๋๋ค.
๋๋ฒ๊น ์ฌ์ ์ ์๊ฒฐ:
- ์ฒซ ๋ฒ์งธ ์ฌ๋ก: ํ๋ก๊ทธ๋จ ํฌ๋์ โ ์ค๋ฅ ์ ํธ ์ถ์ โ ๋ฉ๋ชจ๋ฆฌ ๋ฒ๊ทธ ๋ฐ๊ฒฌ
- ๋ ๋ฒ์งธ ์ฌ๋ก: ์๋ชป๋ ๊ฒฐ๊ณผ ์ถ๋ ฅ โ ํจํด ๋ถ์ โ ๋ก์ง ๋ฒ๊ทธ ๋ฐ๊ฒฌ
- ์ธ ๋ฒ์งธ ์ฌ๋ก: ํ๋ก๊ทธ๋จ ๋ฌดํ ์ ์ง โ ์ค๋ ๋ ์ํ ์กฐ์ฌ โ ์กฐ์จ ๋ฒ๊ทธ ๋ฐ๊ฒฌ
์ด ๊ณ ๊ธ ๋๋ฒ๊น ์ฑ๋ฆฐ์ง์์๋ ๊ณต์ ๋ฉ๋ชจ๋ฆฌ, LayoutTensor ์ฐ์ฐ, ๋ฐฐ๋ฆฌ์ด ๋๊ธฐํ๊ฐ ์ฝํ ์ค๋ ๋ ์กฐ์จ ์คํจ๋ฅผ ์กฐ์ฌํ๋ ๋ฐฉ๋ฒ์ ๋ฐฐ์๋๋ค - ์ด์ ์ฌ๋ก๋ค์์ ์ตํ ์ฒด๊ณ์ ์ธ ์กฐ์ฌ ๊ธฐ์ ์ ์ด๋์ํฉ๋๋ค.
์ฌ์ ์ค๋น: Mojo GPU ๋๋ฒ๊น ์ ํต์ฌ, ํ์ ์์ฌ: ์ฒซ ๋ฒ์งธ ์ฌ๋ก, ํ์ ์์ฌ: ๋ ๋ฒ์งธ ์ฌ๋ก๋ฅผ ๋จผ์ ์๋ฃํด์ CUDA-GDB ์ํฌํ๋ก์ฐ, ๋ณ์ ๊ฒ์ฌ์ ํ๊ณ, ์ฒด๊ณ์ ์ธ ๋๋ฒ๊น ์ ๊ทผ๋ฒ์ ์ดํดํ์ธ์. ์๋ ์ค์ ๋ช ๋ น์ ์คํํ๋์ง ํ์ธํ์ธ์:
pixi run -e nvidia setup-cuda-gdb
ํต์ฌ ๊ฐ๋
์ด๋ฒ ๋๋ฒ๊น ์ฑ๋ฆฐ์ง์์ ๋ฐฐ์ธ ๋ด์ฉ:
- ๋ฐฐ๋ฆฌ์ด ๊ต์ฐฉ ์ํ ํ์ง: ์ค๋ ๋๋ค์ด ๋๊ธฐํ ์ง์ ์์ ์์ํ ๊ธฐ๋ค๋ฆฌ๊ฒ ๋๋ ์ํฉ ์๋ณํ๊ธฐ
- ๊ณต์ ๋ฉ๋ชจ๋ฆฌ ์กฐ์จ: LayoutTensor๋ฅผ ์ฌ์ฉํ ์ค๋ ๋ ํ๋ ฅ ํจํด ์ดํดํ๊ธฐ
- ์กฐ๊ฑด๋ถ ์คํ ๋ถ์: ์ผ๋ถ ์ค๋ ๋๊ฐ ๋ค๋ฅธ ์ฝ๋ ๊ฒฝ๋ก๋ฅผ ํ ๋ ๋๋ฒ๊น ํ๊ธฐ
- ์ค๋ ๋ ์กฐ์จ ๋๋ฒ๊น : CUDA-GDB๋ก ๋ค์ค ์ค๋ ๋ ๋๊ธฐํ ์คํจ ๋ถ์ํ๊ธฐ
์ฝ๋ ์คํ
๋จผ์ ์ ์ฒด ์ฝ๋๋ฅผ ๋ณด์ง ์๊ณ ์ปค๋๋ง ์ดํด๋ด ์๋ค:
fn collaborative_filter(
output: LayoutTensor[dtype, vector_layout, MutAnyOrigin],
a: LayoutTensor[dtype, vector_layout, ImmutAnyOrigin],
):
thread_id = thread_idx.x
# Shared memory workspace for collaborative processing
shared_workspace = LayoutTensor[
dtype,
Layout.row_major(SIZE - 1),
MutAnyOrigin,
address_space = AddressSpace.SHARED,
].stack_allocation()
# Phase 1: Initialize shared workspace (all threads participate)
if thread_id < SIZE - 1:
shared_workspace[thread_id] = rebind[Scalar[dtype]](a[thread_id])
barrier()
# Phase 2: Collaborative processing
if thread_id < SIZE - 1:
# Apply collaborative filter with neighbors
if thread_id > 0:
shared_workspace[thread_id] += shared_workspace[thread_id - 1] * 0.5
barrier()
# Phase 3: Final synchronization and output
barrier()
# Write filtered results back to output
if thread_id < SIZE - 1:
output[thread_id] = shared_workspace[thread_id]
else:
output[thread_id] = rebind[Scalar[dtype]](a[thread_id])
๋ฒ๊ทธ๋ฅผ ์ง์ ๊ฒฝํํ๋ ค๋ฉด ํฐ๋ฏธ๋์์ ๋ค์ ๋ช
๋ น์ ์คํํ์ธ์ (pixi ์ ์ฉ):
pixi run -e nvidia p09 --third-case
๋ค์๊ณผ ๊ฐ์ ์ถ๋ ฅ์ด ๋ํ๋ฉ๋๋ค - ํ๋ก๊ทธ๋จ์ด ๋ฌดํ์ ๋ฉ์ถฅ๋๋ค:
Third Case: Advanced collaborative filtering with shared memory...
WARNING: This may hang - use Ctrl+C to stop if needed
Input array: [1, 2, 3, 4]
Applying collaborative filter using shared memory...
Each thread cooperates with neighbors for smoothing...
Waiting for GPU computation to complete...
[HANGS FOREVER - Use Ctrl+C to stop]
โ ๏ธ ๊ฒฝ๊ณ : ์ด ํ๋ก๊ทธ๋จ์ ๋ฉ์ถฐ์ ์๋ฃ๋์ง ์์ต๋๋ค. Ctrl+C๋ก ์ค๋จํ์ธ์.
๊ณผ์ : ํ์ ์์ฌ
๋์ : ํ๋ก๊ทธ๋จ์ด ์ ์์ ์ผ๋ก ์์๋์ง๋ง GPU ์ฐ์ฐ ์ค์ ๋ฉ์ถฐ์ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ์ง ์์ต๋๋ค. ์ฝ๋๋ฅผ ๋ณด์ง ์์ ์ํ์์, ์ด ๊ต์ฐฉ ์ํ๋ฅผ ์กฐ์ฌํ๊ธฐ ์ํ ์ฒด๊ณ์ ์ธ ์ ๊ทผ๋ฒ์ ๋ฌด์์ผ๊น์?
์๊ฐํด๋ณผ ์ :
- GPU ์ปค๋์ด ์์ ์๋ฃ๋์ง ์๊ฒ ๋ง๋๋ ์์ธ์ ๋ฌด์์ผ๊น์?
- ์ค๋ ๋ ์กฐ์จ ๋ฌธ์ ๋ฅผ ์ด๋ป๊ฒ ์กฐ์ฌํ์๊ฒ ์ต๋๊น?
- ์ค๋ฅ ๋ฉ์์ง ์์ด ํ๋ก๊ทธ๋จ์ด ๊ทธ๋ฅ โ๋ฉ์ถฐ๋ฒ๋ฆดโ ๋ ์ด๋ค ๋๋ฒ๊น ์ ๋ต์ด ํตํ ๊น์?
- ์ค๋ ๋๋ค์ด ์ ๋๋ก ํ๋ ฅํ์ง ์์ ์๋ ์๋ค๋ฉด ์ด๋ป๊ฒ ๋๋ฒ๊น ํ ๊น์?
- ์ฒด๊ณ์ ์กฐ์ฌ(์ฒซ ๋ฒ์งธ ์ฌ๋ก)์ ์คํ ํ๋ฆ ๋ถ์(๋ ๋ฒ์งธ ์ฌ๋ก)์ ๊ฒฐํฉํด์ ์กฐ์จ ์คํจ๋ฅผ ์ด๋ป๊ฒ ๋๋ฒ๊น ํ ์ ์์๊น์?
๋ค์ ๋ช ๋ น์ผ๋ก ์์ํด ๋ณด์ธ์:
pixi run -e nvidia mojo debug --cuda-gdb --break-on-launch problems/p09/p09.mojo --third-case
GDB ๋ช ๋ น์ด ๋จ์ถํค (๋น ๋ฅธ ๋๋ฒ๊น )
์ด ๋จ์ถํค๋ค์ ์ฌ์ฉํ๋ฉด ๋๋ฒ๊น ์ธ์ ์๋๋ฅผ ๋์ผ ์ ์์ต๋๋ค:
| ๋จ์ถ | ์ ์ฒด | ์ฌ์ฉ ์์ |
|---|---|---|
r | run | (cuda-gdb) r |
n | next | (cuda-gdb) n |
c | continue | (cuda-gdb) c |
b | break | (cuda-gdb) b 62 |
p | print | (cuda-gdb) p thread_id |
q | quit | (cuda-gdb) q |
์๋ ๋ชจ๋ ๋๋ฒ๊น ๋ช ๋ น์ ํจ์จ์ฑ์ ์ํด ๋จ์ถํค๋ฅผ ์ฌ์ฉํฉ๋๋ค!
ํ
- ์๋ฆฌ ์๋ ๋ฉ์ถค ์กฐ์ฌ - ์ค๋ฅ ๋ฉ์์ง ์์ด ํ๋ก๊ทธ๋จ์ด ๋ฉ์ถฐ๋ฒ๋ฆด ๋, GPU์ ์ด๋ค ๊ธฐ๋ณธ ์์๊ฐ ๋ฌดํ ๋๊ธฐ๋ฅผ ์ผ์ผํฌ ์ ์์๊น์?
- ์ค๋ ๋ ์ํ ๊ฒ์ฌ -
info cuda threads๋ก ์๋ก ๋ค๋ฅธ ์ค๋ ๋๋ค์ด ์ด๋์ ๋ฉ์ท๋์ง ํ์ธํ์ธ์ - ์กฐ๊ฑด๋ถ ์คํ ๋ถ์ - ์ด๋ค ์ค๋ ๋๊ฐ ์ด๋ค ์ฝ๋ ๊ฒฝ๋ก๋ฅผ ์คํํ๋์ง ํ์ธํ์ธ์ (๋ชจ๋ ์ค๋ ๋๊ฐ ๊ฐ์ ๊ฒฝ๋ก๋ฅผ ๋ฐ๋ฅด๋์?)
- ๋๊ธฐํ ์ง์ ์กฐ์ฌ - ์ค๋ ๋๋ค์ด ์กฐ์จํด์ผ ํ ์๋ ์๋ ์ง์ ์ ์ฐพ์ผ์ธ์
- ์ค๋ ๋ ๋ถ๊ธฐ ํ์ง - ๋ชจ๋ ์ค๋ ๋๊ฐ ๊ฐ์ ํ๋ก๊ทธ๋จ ์์น์ ์๋์, ์๋๋ฉด ์ผ๋ถ๋ ๋ค๋ฅธ ๊ณณ์ ์๋์?
- ์กฐ์จ ๊ธฐ๋ณธ ์์ ๋ถ์ - ๋ชจ๋ ์ค๋ ๋๊ฐ ๊ฐ์ ๋๊ธฐํ ์ฐ์ฐ์ ์ฐธ์ฌํ์ง ์์ผ๋ฉด ์ด๋ป๊ฒ ๋ ๊น์?
- ์คํ ํ๋ฆ ์ถ์ - ๊ฐ ์ค๋ ๋๊ฐ ์กฐ๊ฑด๋ฌธ์ ํตํด ์ด๋ค ๊ฒฝ๋ก๋ฅผ ๋ฐ๋ผ๊ฐ๋์ง ์ถ์ ํ์ธ์
- ์ค๋ ๋ ID ์ํฅ ๋ถ์ - ์๋ก ๋ค๋ฅธ ์ค๋ ๋ ID๊ฐ ์ด๋ค ์ฝ๋ ๊ฒฝ๋ก๋ฅผ ์คํํ ์ง ์ด๋ป๊ฒ ์ํฅ์ ๋ฏธ์น๋์?
๐ก ์กฐ์ฌ ๊ณผ์ ๊ณผ ํด๊ฒฐ์ฑ
CUDA-GDB๋ก ๋จ๊ณ๋ณ ์กฐ์ฌ
1๋จ๊ณ: ์คํ๊ณผ ์ด๊ธฐ ์ค์
Step 1: ๋๋ฒ๊ฑฐ ์คํ
pixi run -e nvidia mojo debug --cuda-gdb --break-on-launch problems/p09/p09.mojo --third-case
Step 2: ์ ์ง ํ์ ๋ถ์
๋๋ฒ๊น ์ ๋ค์ด๊ฐ๊ธฐ ์ ์ ์๊ณ ์๋ ์ ๋ณด๋ฅผ ์ ๋ฆฌํฉ๋๋ค:
๊ธฐ๋๊ฐ: ํ๋ก๊ทธ๋จ์ด ์๋ฃ๋๊ณ ํํฐ๋ง๋ ๊ฒฐ๊ณผ ํ์
์ค์ : "Waiting for GPU computation to complete..."์์ ๋ฉ์ถค
๐ ์ด๊ธฐ ๊ฐ์ค: GPU ์ปค๋์ด ๊ต์ฐฉ ์ํ์ ๋น ์ง - ์ด๋ค ๋๊ธฐํ ๊ธฐ๋ณธ ์์๊ฐ ์ค๋ ๋๋ค์ ์์ํ ๋๊ธฐ์ํค๊ณ ์์ต๋๋ค.
2๋จ๊ณ: ์ปค๋ ์ง์
Step 3: ์คํ ๋ฐ ์ปค๋ ์ง์ ๊ด์ฐฐ
(cuda-gdb) r
Starting program: .../mojo run problems/p09/p09.mojo --third-case
Third Case: Advanced collaborative filtering with shared memory...
WARNING: This may hang - use Ctrl+C to stop if needed
Input array: [1, 2, 3, 4]
Applying collaborative filter using shared memory...
Each thread cooperates with neighbors for smoothing...
Waiting for GPU computation to complete...
[Switching focus to CUDA kernel 0, grid 1, block (0,0,0), thread (0,0,0), device 0, sm 0, warp 0, lane 0]
CUDA thread hit application kernel entry function breakpoint, p09_collaborative_filter_Orig6A6AcB6A6A_1882ca334fc2d34b2b9c4fa338df6c07<<<(1,1,1),(4,1,1)>>> (
output=..., a=...)
at /home/ubuntu/workspace/mojo-gpu-puzzles/problems/p09/p09.mojo:56
56 a: LayoutTensor[mut=False, dtype, vector_layout],
๐ ์ฃผ์ ๊ด์ฐฐ:
- Grid: (1,1,1) - ๋จ์ผ ๋ธ๋ก
- Block: (4,1,1) - ์ด 4๊ฐ ์ค๋ ๋ (0, 1, 2, 3)
- ํ์ฌ ์ค๋ ๋: (0,0,0) - ์ค๋ ๋ 0 ๋๋ฒ๊น ์ค
- ํจ์: ๊ณต์ ๋ฉ๋ชจ๋ฆฌ ์ฐ์ฐ์ ์ฌ์ฉํ๋ collaborative_filter
Step 4: ์ด๊ธฐํ ๊ณผ์ ํ์
(cuda-gdb) n
55 output: LayoutTensor[mut=True, dtype, vector_layout],
(cuda-gdb) n
58 thread_id = thread_idx.x
(cuda-gdb) n
66 ].stack_allocation()
(cuda-gdb) n
69 if thread_id < SIZE - 1:
(cuda-gdb) p thread_id
$1 = 0
โ
์ค๋ ๋ 0 ์ํ: thread_id = 0, ์กฐ๊ฑด 0 < 3 ๊ฒ์ฌ ์ง์ โ True
Step 5: 1๋จ๊ณ ์ถ์
(cuda-gdb) n
70 shared_workspace[thread_id] = rebind[Scalar[dtype]](a[thread_id])
(cuda-gdb) n
69 if thread_id < SIZE - 1:
(cuda-gdb) n
71 barrier()
1๋จ๊ณ ์๋ฃ: ์ค๋ ๋ 0์ด ์ด๊ธฐํ๋ฅผ ์คํํ๊ณ ์ฒซ ๋ฒ์งธ ๋ฐฐ๋ฆฌ์ด์ ๋๋ฌํ์ต๋๋ค.
3๋จ๊ณ: ๊ฒฐ์ ์ ์ธ ๋ฐฐ๋ฆฌ์ด ์กฐ์ฌ
Step 6: ์ฒซ ๋ฒ์งธ ๋ฐฐ๋ฆฌ์ด ๊ฒ์ฌ
(cuda-gdb) n
74 if thread_id < SIZE - 1:
(cuda-gdb) info cuda threads
BlockIdx ThreadIdx To BlockIdx To ThreadIdx Count PC Filename Line
Kernel 0
* (0,0,0) (0,0,0) (0,0,0) (3,0,0) 4 0x00007fffd3272180 /home/ubuntu/workspace/mojo-gpu-puzzles/problems/p09/p09.mojo 74
โ ์ ์: 4๊ฐ ์ค๋ ๋ ๋ชจ๋ 74๋ฒ ์ค(์ฒซ ๋ฒ์งธ ๋ฐฐ๋ฆฌ์ด ํต๊ณผ ํ)์ ์์ต๋๋ค. ์ฒซ ๋ฒ์งธ ๋ฐฐ๋ฆฌ์ด๋ ์ ์ ์๋ํ์ต๋๋ค.
๐ ๊ฒฐ์ ์ ์ง์ : ์ด์ ๋ ๋ค๋ฅธ ์กฐ๊ฑด๋ฌธ์ด ์๋ 2๋จ๊ณ์ ์ง์ ํฉ๋๋ค.
Step 7: 2๋จ๊ณ ์ถ์ - ์ค๋ ๋ 0 ๊ด์
(cuda-gdb) n
76 if thread_id > 0:
์ค๋ ๋ 0 ๋ถ์: 0 < 3 โ True โ ์ค๋ ๋ 0์ด 2๋จ๊ณ ๋ธ๋ก์ ์ง์
(cuda-gdb) n
78 barrier()
์ค๋ ๋ 0 ๊ฒฝ๋ก: 0 > 0 โ False โ ์ค๋ ๋ 0์ด ๋ด๋ถ ์ฐ์ฐ์ ๊ฑด๋๋ฐ์ง๋ง 78๋ฒ ์ค์ ๋ฐฐ๋ฆฌ์ด์ ๋๋ฌ
๊ฒฐ์ ์ ์๊ฐ: ์ค๋ ๋ 0์ด ์ด์ 78๋ฒ ์ค์ ๋ฐฐ๋ฆฌ์ด์์ ๋๊ธฐ ์ค์ ๋๋ค.
(cuda-gdb) n # <-- ์คํํ๋ฉด ํ๋ก๊ทธ๋จ์ด ๋ฉ์ถฅ๋๋ค!
[HANGS HERE - ํ๋ก๊ทธ๋จ์ด ์ด ์ง์ ์ ๋์ด๊ฐ์ง ๋ชปํจ]
Step 8: ๋ค๋ฅธ ์ค๋ ๋ ์กฐ์ฌ
(cuda-gdb) cuda thread (1,0,0)
[Switching focus to CUDA kernel 0, grid 1, block (0,0,0), thread (1,0,0), device 0, sm 0, warp 0, lane 1]
78 barrier()
(cuda-gdb) p thread_id
$2 = 1
(cuda-gdb) info cuda threads
BlockIdx ThreadIdx To BlockIdx To ThreadIdx Count PC Filename Line
Kernel 0
* (0,0,0) (0,0,0) (0,0,0) (2,0,0) 3 0x00007fffd3273aa0 /home/ubuntu/workspace/mojo-gpu-puzzles/problems/p09/p09.mojo 78
(0,0,0) (3,0,0) (0,0,0) (3,0,0) 1 0x00007fffd3273b10 /home/ubuntu/workspace/mojo-gpu-puzzles/problems/p09/p09.mojo 81
๊ฒฐ์ ์ ์ฆ๊ฑฐ ๋ฐ๊ฒฌ:
- ์ค๋ ๋ 0, 1, 2: 78๋ฒ ์ค์์ ๋ชจ๋ ๋๊ธฐ ์ค (์กฐ๊ฑด ๋ธ๋ก ์์ ๋ฐฐ๋ฆฌ์ด)
- ์ค๋ ๋ 3: 81๋ฒ ์ค์ ์์ (์กฐ๊ฑด ๋ธ๋ก์ ์ง๋์ณค๊ณ , ๋ฐฐ๋ฆฌ์ด์ ๋๋ฌํ ์ ์์!)
Step 9: ์ค๋ ๋ 3์ ์คํ ๊ฒฝ๋ก ๋ถ์
๐ info ์ถ๋ ฅ์ผ๋ก ๋ณธ ์ค๋ ๋ 3 ๋ถ์:
- ์ค๋ ๋ 3: 81๋ฒ ์ค์ ์์น (PC: 0x00007fffd3273b10)
- 2๋จ๊ณ ์กฐ๊ฑด:
thread_id < SIZE - 1โ3 < 3โ False - ๊ฒฐ๊ณผ: ์ค๋ ๋ 3์ 2๋จ๊ณ ๋ธ๋ก(74-78๋ฒ ์ค)์ ์ง์ ํ์ง ์์
- ๊ฒฐ๊ณผ: ์ค๋ ๋ 3์ 78๋ฒ ์ค์ ๋ฐฐ๋ฆฌ์ด์ ๋๋ฌํ ์ ์์
- ํ์ฌ ์ํ: ์ค๋ ๋ 3์ 81๋ฒ ์ค(๋ง์ง๋ง ๋ฐฐ๋ฆฌ์ด)์ ์๊ณ , ์ค๋ ๋ 0,1,2๋ 78๋ฒ ์ค์์ ๊ฐํ ์์
4๋จ๊ณ: ๊ทผ๋ณธ ์์ธ ๋ถ์
Step 10: ๊ต์ฐฉ ์ํ ๋ฉ์ปค๋์ฆ ์๋ณ
# 2๋จ๊ณ: ํ๋ ฅ์ ์ฒ๋ฆฌ
if thread_id < SIZE - 1: # โ ์ค๋ ๋ 0, 1, 2๋ง ์ด ๋ธ๋ก์ ์ง์
# ์ด์๊ณผ ํ๋ ฅ ํํฐ ์ ์ฉ
if thread_id > 0:
shared_workspace[thread_id] += shared_workspace[thread_id - 1] * 0.5
barrier() # โ ๊ต์ฐฉ ์ํ: 4๊ฐ ์ค 3๊ฐ ์ค๋ ๋๋ง ์ฌ๊ธฐ์ ๋๋ฌ!
๐ ๊ต์ฐฉ ์ํ ๋ฉ์ปค๋์ฆ:
- ์ค๋ ๋ 0:
0 < 3โ True โ ๋ธ๋ก ์ง์ โ ๋ฐฐ๋ฆฌ์ด์์ ๋๊ธฐ (69๋ฒ ์ค) - ์ค๋ ๋ 1:
1 < 3โ True โ ๋ธ๋ก ์ง์ โ ๋ฐฐ๋ฆฌ์ด์์ ๋๊ธฐ (69๋ฒ ์ค) - ์ค๋ ๋ 2:
2 < 3โ True โ ๋ธ๋ก ์ง์ โ ๋ฐฐ๋ฆฌ์ด์์ ๋๊ธฐ (69๋ฒ ์ค) - ์ค๋ ๋ 3:
3 < 3โ False โ ๋ธ๋ก์ ์ง์ ์ ํจ โ 72๋ฒ ์ค๋ก ๊ณ์ ์งํ
๊ฒฐ๊ณผ: 3๊ฐ ์ค๋ ๋๊ฐ 4๋ฒ์งธ ์ค๋ ๋๋ฅผ ์์ํ ๊ธฐ๋ค๋ฆฌ์ง๋ง, ์ค๋ ๋ 3์ ๊ทธ ๋ฐฐ๋ฆฌ์ด์ ์ ๋ ๋์ฐฉํ์ง ์์ต๋๋ค.
5๋จ๊ณ: ๋ฒ๊ทธ ํ์ธ๊ณผ ํด๊ฒฐ์ฑ
Step 11: ๊ทผ๋ณธ์ ์ธ ๋ฐฐ๋ฆฌ์ด ๊ท์น ์๋ฐ
GPU ๋ฐฐ๋ฆฌ์ด ๊ท์น: ๋๊ธฐํ๊ฐ ์๋ฃ๋๋ ค๋ฉด ์ค๋ ๋ ๋ธ๋ก์ ๋ชจ๋ ์ค๋ ๋๊ฐ ๊ฐ์ ๋ฐฐ๋ฆฌ์ด์ ๋๋ฌํด์ผ ํฉ๋๋ค.
๋ฌด์์ด ์๋ชป๋์๋:
# โ ์๋ชป๋ ๋ฐฉ๋ฒ: ์กฐ๊ฑด๋ฌธ ์์ ๋ฐฐ๋ฆฌ์ด
if thread_id < SIZE - 1: # ๋ชจ๋ ์ค๋ ๋๊ฐ ์ง์
ํ์ง ์์
# ... ์ฐ์ฐ ...
barrier() # ์ผ๋ถ ์ค๋ ๋๋ง ์ฌ๊ธฐ์ ๋๋ฌ
# โ
์ฌ๋ฐ๋ฅธ ๋ฐฉ๋ฒ: ์กฐ๊ฑด๋ฌธ ๋ฐ์ ๋ฐฐ๋ฆฌ์ด
if thread_id < SIZE - 1: # ๋ชจ๋ ์ค๋ ๋๊ฐ ์ง์
ํ์ง ์์
# ... ์ฐ์ฐ ...
barrier() # ๋ชจ๋ ์ค๋ ๋๊ฐ ์ฌ๊ธฐ์ ๋๋ฌ
์์ ๋ฐฉ๋ฒ: ๋ฐฐ๋ฆฌ์ด๋ฅผ ์กฐ๊ฑด ๋ธ๋ก ๋ฐ์ผ๋ก ์ด๋:
fn collaborative_filter(
output: LayoutTensor[mut=True, dtype, vector_layout],
a: LayoutTensor[mut=False, dtype, vector_layout],
):
thread_id = thread_idx.x
shared_workspace = LayoutTensor[
dtype,
Layout.row_major(SIZE-1),
MutAnyOrigin,
address_space = AddressSpace.SHARED,
].stack_allocation()
# 1๋จ๊ณ: ๊ณต์ ์์
๊ณต๊ฐ ์ด๊ธฐํ (๋ชจ๋ ์ค๋ ๋ ์ฐธ์ฌ)
if thread_id < SIZE - 1:
shared_workspace[thread_id] = rebind[Scalar[dtype]](a[thread_id])
barrier()
# 2๋จ๊ณ: ํ๋ ฅ์ ์ฒ๋ฆฌ
if thread_id < SIZE - 1:
if thread_id > 0:
shared_workspace[thread_id] += shared_workspace[thread_id - 1] * 0.5
# โ
์์ : ๋ฐฐ๋ฆฌ์ด๋ฅผ ์กฐ๊ฑด๋ฌธ ๋ฐ์ผ๋ก ์ด๋ํด์ ๋ชจ๋ ์ค๋ ๋๊ฐ ๋๋ฌํ๋๋ก
barrier()
# 3๋จ๊ณ: ์ต์ข
๋๊ธฐํ์ ์ถ๋ ฅ
barrier()
if thread_id < SIZE - 1:
output[thread_id] = shared_workspace[thread_id]
else:
output[thread_id] = rebind[Scalar[dtype]](a[thread_id])
ํต์ฌ ๋๋ฒ๊น ๊ตํ
๋ฐฐ๋ฆฌ์ด ๊ต์ฐฉ ์ํ ํ์ง:
info cuda threads์ฌ์ฉ - ์ด๋ค ์ค๋ ๋๊ฐ ์ด๋ ์ค์ ์๋์ง ๋ณด์ฌ์ค- ์ค๋ ๋ ์ํ ๋ถ๊ธฐ ์ฐพ๊ธฐ - ์ผ๋ถ ์ค๋ ๋๊ฐ ๋ค๋ฅธ ํ๋ก๊ทธ๋จ ์์น์ ์์
- ์กฐ๊ฑด๋ถ ์คํ ๊ฒฝ๋ก ์ถ์ - ๋ชจ๋ ์ค๋ ๋๊ฐ ๊ฐ์ ๋ฐฐ๋ฆฌ์ด์ ๋๋ฌํ๋์ง ํ์ธ
- ๋ฐฐ๋ฆฌ์ด ๋๋ฌ ๊ฐ๋ฅ์ฑ ๊ฒ์ฆ - ๋ค๋ฅธ ์ค๋ ๋๋ค์ด ๋๋ฌํ๋ ๋ฐฐ๋ฆฌ์ด๋ฅผ ๊ฑด๋๋ฐ๋ ์ค๋ ๋๊ฐ ์๋์ง ํ์ธ
์ค๋ฌด GPU ๋๋ฒ๊น ์ ํ์ค:
- ๊ต์ฐฉ ์ํ๋ ์๋ฆฌ ์๋ ์ด์ธ์ - ์ค๋ฅ ๋ฉ์์ง ์์ด ํ๋ก๊ทธ๋จ์ด ๊ทธ๋ฅ ๋ฉ์ถค
- ์ค๋ ๋ ์กฐ์จ ๋๋ฒ๊น ์ ์ธ๋ด๊ฐ ํ์ - ๊ฐ ์ค๋ ๋ ๊ฒฝ๋ก๋ฅผ ์ฒด๊ณ์ ์ผ๋ก ๋ถ์ํด์ผ ํจ
- ์กฐ๊ฑด๋ถ ๋ฐฐ๋ฆฌ์ด๊ฐ ๊ต์ฐฉ ์ํ์ 1์์ ์์ธ - ๋ชจ๋ ์ค๋ ๋๊ฐ ๊ฐ์ ๋๊ธฐํ ์ง์ ์ ๋๋ฌํ๋์ง ํญ์ ํ์ธ
- CUDA-GDB ์ค๋ ๋ ๊ฒ์ฌ๊ฐ ํ์ - ์ค๋ ๋ ์กฐ์จ ์คํจ๋ฅผ ๋ณผ ์ ์๋ ์ ์ผํ ๋ฐฉ๋ฒ
๊ณ ๊ธ GPU ๋๊ธฐํ:
- ๋ฐฐ๋ฆฌ์ด ๊ท์น: ๋ธ๋ก์ ๋ชจ๋ ์ค๋ ๋๊ฐ ๊ฐ์ ๋ฐฐ๋ฆฌ์ด์ ๋๋ฌํด์ผ ํจ
- ์กฐ๊ฑด๋ถ ์คํ์ ํจ์ : ์ด๋ค if๋ฌธ์ด๋ ์ค๋ ๋ ๋ถ๊ธฐ๋ฅผ ์ผ์ผํฌ ์ ์์
- ๊ณต์ ๋ฉ๋ชจ๋ฆฌ ์กฐ์จ: ์ฌ๋ฐ๋ฅธ ๋๊ธฐํ๋ฅผ ์ํด ๋ฐฐ๋ฆฌ์ด ๋ฐฐ์น์ ์ฃผ์ ํ์
- LayoutTensor๊ฐ ๊ต์ฐฉ ์ํ๋ฅผ ๋ง์์ฃผ์ง ์์: ๊ณ ์์ค ์ถ์ํ๋ผ๋ ์ฌ๋ฐ๋ฅธ ๋๊ธฐํ๋ ์ฌ์ ํ ํ์
๐ก ํต์ฌ ํต์ฐฐ: ๋ฐฐ๋ฆฌ์ด ๊ต์ฐฉ ์ํ๋ GPU ๋ฒ๊ทธ ์ค ๋๋ฒ๊น ํ๊ธฐ ๊ฐ์ฅ ์ด๋ ค์ด ์ ํ์ ์ํฉ๋๋ค:
- ์ค๋ฅ๊ฐ ๋ณด์ด์ง ์์ - ๊ทธ์ ๋ฌดํ ๋๊ธฐ
- ๋ค์ค ์ค๋ ๋ ๋ถ์ ํ์ - ์ค๋ ๋ ํ๋๋ง ๋ด์๋ ๋๋ฒ๊น ํ ์ ์์
- ์กฐ์ฉํ ์คํจ ๋ชจ๋ - ์ ํ์ฑ ๋ฒ๊ทธ๊ฐ ์๋ ์ฑ๋ฅ ๋ฌธ์ ์ฒ๋ผ ๋ณด์
- ๋ณต์กํ ์ค๋ ๋ ์กฐ์จ - ๋ชจ๋ ์ค๋ ๋์ ๊ฑธ์ณ ์คํ ๊ฒฝ๋ก๋ฅผ ์ถ์ ํด์ผ ํจ
CUDA-GDB๋ก ์ค๋ ๋ ์ํ๋ฅผ ๋ถ์ํ๊ณ , ๋ถ๊ธฐ๋ ์คํ ๊ฒฝ๋ก๋ฅผ ์๋ณํ๊ณ , ๋ฐฐ๋ฆฌ์ด ๋๋ฌ ๊ฐ๋ฅ์ฑ์ ๊ฒ์ฆํ๋ ์ด ๋๋ฒ๊น ๋ฐฉ์์ ์ค๋ฌด GPU ๊ฐ๋ฐ์๋ค์ด ์ด์ ์์คํ ์์ ๊ต์ฐฉ ์ํ ๋ฌธ์ ์ ๋ง๋ฅ๋จ๋ ธ์ ๋ ์ฐ๋ ๋ฐฉ๋ฒ๊ณผ ์ ํํ ๊ฐ์ต๋๋ค.
๋ค์ ๋จ๊ณ: GPU ๋๋ฒ๊น ์คํฌ ์์ฑ
GPU ๋๋ฒ๊น ์ผ๋ถ์์ ์๋ฃํ์ต๋๋ค!
์์ฑ๋ GPU ๋๋ฒ๊น ๋ฌด๊ธฐ๊ณ
์ฒซ ๋ฒ์งธ ์ฌ๋ก์์ - ํฌ๋์ ๋๋ฒ๊น :
- โ ์ค๋ฅ ๋ฉ์์ง๋ฅผ ๊ฐ์ด๋ ์ผ์ ์ฒด๊ณ์ ์ธ ํฌ๋์ ์กฐ์ฌ
- โ ํฌ์ธํฐ ์ฃผ์ ๊ฒ์ฌ๋ฅผ ํตํ ๋ฉ๋ชจ๋ฆฌ ๋ฒ๊ทธ ํ์ง
- โ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ จ ๋ฌธ์ ๋ฅผ ์ํ CUDA-GDB ๊ธฐ์ด
๋ ๋ฒ์งธ ์ฌ๋ก์์ - ๋ก์ง ๋ฒ๊ทธ ๋๋ฒ๊น :
- โ ๋๋ ทํ ์ฆ์ ์์ด ์๊ณ ๋ฆฌ์ฆ ์ค๋ฅ ์กฐ์ฌ
- โ ์๋ชป๋ ๊ฒฐ๊ณผ๋ฅผ ๊ทผ๋ณธ ์์ธ๊น์ง ์ถ์ ํ๋ ํจํด ๋ถ์ ๊ธฐ๋ฒ
- โ ๋ณ์ ๊ฒ์ฌ๊ฐ ์ ๋ ๋ ์คํ ํ๋ฆ ๋๋ฒ๊น
์ธ ๋ฒ์งธ ์ฌ๋ก์์ - ์กฐ์จ ๋๋ฒ๊น :
- โ ์ค๋ ๋ ์กฐ์จ ์คํจ๋ฅผ ์ํ ๋ฐฐ๋ฆฌ์ด ๊ต์ฐฉ ์ํ ์กฐ์ฌ
- โ ๊ณ ๊ธ CUDA-GDB ๊ธฐ๋ฒ์ ์ฌ์ฉํ ๋ค์ค ์ค๋ ๋ ์ํ ๋ถ์
- โ ๋ณต์กํ ๋ณ๋ ฌ ํ๋ก๊ทธ๋จ์ ์ํ ๋๊ธฐํ ๊ฒ์ฆ
์ ๋ฌธ๊ฐ์ GPU ๋๋ฒ๊น ๋ฐฉ๋ฒ๋ก
์ค๋ฌด GPU ๊ฐ๋ฐ์๋ค์ด ์ฌ์ฉํ๋ ์ฒด๊ณ์ ์ธ ์ ๊ทผ๋ฒ์ ์ตํ์ต๋๋ค:
- ์ฆ์ ์ฝ๊ธฐ - ํฌ๋์์ธ๊ฐ? ์๋ชป๋ ๊ฒฐ๊ณผ์ธ๊ฐ? ๋ฌดํ ์ ์ง์ธ๊ฐ?
- ๊ฐ์ค ์๋ฆฝ - ๋ฉ๋ชจ๋ฆฌ ๋ฌธ์ ? ๋ก์ง ์ค๋ฅ? ์กฐ์จ ๋ฌธ์ ?
- ์ฆ๊ฑฐ ์์ง - ๋ฒ๊ทธ ์ ํ์ ๋ง์ถฐ CUDA-GDB๋ฅผ ์ ๋ต์ ์ผ๋ก ํ์ฉ
- ์ฒด๊ณ์ ์ผ๋ก ํ ์คํธ - ๋ชฉํ ์งํฅ์ ์กฐ์ฌ๋ฅผ ํตํด ๊ฐ ๊ฐ์ค ๊ฒ์ฆ
- ๊ทผ๋ณธ ์์ธ ์ถ์ - ์ฆ๊ฑฐ์ ์ฐ๊ฒฐ ๊ณ ๋ฆฌ๋ฅผ ๋ฐ๋ผ ์์ฒ๊น์ง
์ ์ ๋ฌ์ฑ: ์ด์ ๊ฐ์ฅ ํํ ์ธ ๊ฐ์ง GPU ํ๋ก๊ทธ๋๋ฐ ๋ฌธ์ ๋ฅผ ๋๋ฒ๊น ํ ์ ์์ต๋๋ค:
- ๋ฉ๋ชจ๋ฆฌ ํฌ๋์ (์ฒซ ๋ฒ์งธ ์ฌ๋ก) - null ํฌ์ธํฐ, ๋ฒ์ ๋ฐ ์ ๊ทผ
- ๋ก์ง ๋ฒ๊ทธ (๋ ๋ฒ์งธ ์ฌ๋ก) - ์๊ณ ๋ฆฌ์ฆ ์ค๋ฅ, ์๋ชป๋ ๊ฒฐ๊ณผ
- ์กฐ์จ ๊ต์ฐฉ ์ํ (์ธ ๋ฒ์งธ ์ฌ๋ก) - ๋ฐฐ๋ฆฌ์ด ๋๊ธฐํ ์คํจ