Puzzle 6: λΈλ‘
κ°μ
λ²‘ν° aμ κ° μμΉμ 10μ λν΄ outputμ μ μ₯νλ 컀λμ ꡬνν΄ λ³΄μΈμ.
μ€λ λ λΈλ‘(thread block) (λλ μ€μ¬μ λΈλ‘)μ νλμ GPU λ©ν°νλ‘μΈμμμ ν¨κ» μ€νλλ μ€λ λ λ¬Άμμ
λλ€. κ°μ λΈλ‘ μμ λͺ¨λ μ€λ λλ 곡μ λ©λͺ¨λ¦¬λ₯Ό ν¨κ» μ¬μ©νκ³ μλ‘ λκΈ°νν μ μμ΅λλ€. λ°μ΄ν°κ° ν λΈλ‘μ΄ μ²λ¦¬ν μ μλ λ²μλ³΄λ€ ν¬λ©΄ GPUλ μ¬λ¬ λΈλ‘μ μ€μΌμ€λ§νκ³ , κ° λΈλ‘μ μκΈ° λͺ«μ λ°μ΄ν°λ₯Ό λ
립μ μΌλ‘ μ²λ¦¬ν©λλ€. μ€λ λμ μ μ μμΉλ λΈλ‘ λ΄ μμΉ(thread_idx.x)μ μμ λΈλ‘(block_idx.x)μ ν©μ³ κ³μ°ν©λλ€: global_i = block_dim.x * block_idx.x + thread_idx.x.
μ°Έκ³ : λΈλ‘λΉ μ€λ λ μκ° aμ ν¬κΈ°λ³΄λ€ μμ΅λλ€.
ν΅μ¬ κ°λ
μ΄ νΌμ¦μμ λ€λ£¨λ λ΄μ©:
- μ€λ λ λΈλ‘ ν¬κΈ°λ³΄λ€ ν° λ°μ΄ν° μ²λ¦¬
- μ¬λ¬ λΈλ‘μ μ€λ λ μ‘°μ¨
- μ μ μ€λ λ μμΉ κ³μ°
μ¬κΈ°μ ν΅μ¬μ μ¬λ¬ μ€λ λ λΈλ‘μ΄ νλ ₯νμ¬ λ¨μΌ λΈλ‘ μ©λλ³΄λ€ ν° λ°μ΄ν°λ₯Ό μ²λ¦¬νλ©΄μλ, μμμ μ€λ λ κ° μ¬λ°λ₯Έ λ§€νμ μ μ§νλ μ리λ₯Ό μ΄ν΄νλ κ²μ λλ€.
μμ±ν μ½λ
comptime SIZE = 9
comptime BLOCKS_PER_GRID = (3, 1)
comptime THREADS_PER_BLOCK = (4, 1)
comptime dtype = DType.float32
def add_10_blocks(
output: UnsafePointer[Scalar[dtype], MutAnyOrigin],
a: UnsafePointer[Scalar[dtype], MutAnyOrigin],
size: Int,
):
var i = block_dim.x * block_idx.x + thread_idx.x
# FILL ME IN (roughly 2 lines)
μ 체 μ½λ 보기: problems/p06/p06.mojo
μ°Έκ³ : μ΄ νΌμ¦μ
TileTensorλ²μ μ κ±°μ λμΌνλ―λ‘ λ μμκ² λ§‘κΉλλ€.
ν
- μ μ μΈλ±μ€ κ³μ°:
i = block_dim.x * block_idx.x + thread_idx.x - κ°λ μΆκ°:
if i < size - κ°λ λ΄λΆ:
output[i] = a[i] + 10.0
μ½λ μ€ν
μ루μ μ ν μ€νΈνλ €λ©΄ ν°λ―Έλμμ λ€μ λͺ λ Ήμ΄λ₯Ό μ€ννμΈμ:
pixi run p06
pixi run -e amd p06
pixi run -e apple p06
uv run poe p06
νΌμ¦μ μμ§ νμ§ μμλ€λ©΄ μΆλ ₯μ΄ λ€μκ³Ό κ°μ΄ λνλ©λλ€:
out: HostBuffer([0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0])
expected: HostBuffer([10.0, 11.0, 12.0, 13.0, 14.0, 15.0, 16.0, 17.0, 18.0])
μ루μ
def add_10_blocks(
output: UnsafePointer[Scalar[dtype], MutAnyOrigin],
a: UnsafePointer[Scalar[dtype], MutAnyOrigin],
size: Int,
):
var i = block_dim.x * block_idx.x + thread_idx.x
if i < size:
output[i] = a[i] + 10.0
μ΄ μ루μ μ λΈλ‘ κΈ°λ° GPU μ²λ¦¬μ ν΅μ¬ κ°λ μ λ€λ£Ήλλ€:
-
μ μ μ€λ λ μΈλ±μ±
-
λΈλ‘ μΈλ±μ€μ μ€λ λ μΈλ±μ€λ₯Ό κ²°ν©:
block_dim.x * block_idx.x + thread_idx.x -
κ° μ€λ λλ₯Ό κ³ μ ν μ μ μμΉμ λ§€ν
-
λΈλ‘λΉ 3κ° μ€λ λ μμ:
Block 0: [0 1 2] Block 1: [3 4 5] Block 2: [6 7 8]
-
-
λΈλ‘ μ‘°μ¨
-
κ° λΈλ‘μ μ°μλ λ°μ΄ν° μ²ν¬λ₯Ό μ²λ¦¬
-
λΈλ‘ ν¬κΈ°(3) < λ°μ΄ν° ν¬κΈ°(9)μ΄λ―λ‘ μ¬λ¬ λΈλ‘ νμ
-
λΈλ‘ κ° μλ μμ λΆλ°°:
Data: [0 1 2 3 4 5 6 7 8] Block 0: [0 1 2] Block 1: [3 4 5] Block 2: [6 7 8]
-
-
κ²½κ³ κ²μ¬
- κ°λ 쑰건
i < sizeλ‘ κ²½κ³ μΌμ΄μ€ μ²λ¦¬ - λ°μ΄ν° ν¬κΈ°κ° λΈλ‘ ν¬κΈ°λ‘ λλμ΄ λ¨μ΄μ§μ§ μμ λ λ²μλ₯Ό λ²μ΄λ μ κ·Ό λ°©μ§
- λ°μ΄ν° λλΆλΆμ λΆμμ ν λΈλ‘ μ²λ¦¬μ νμ
- κ°λ 쑰건
-
λ©λͺ¨λ¦¬ μ κ·Ό ν¨ν΄
- λ³ν©(coalesced) λ©λͺ¨λ¦¬ μ κ·Ό: λΈλ‘ λ΄ μ€λ λλ€μ΄ μ°μλ λ©λͺ¨λ¦¬μ μ κ·Ό
- κ° μ€λ λκ° νλμ μμ μ²λ¦¬:
output[i] = a[i] + 10.0 - λΈλ‘ μμ€ λ³λ ¬μ±μΌλ‘ λ©λͺ¨λ¦¬ λμνμ ν¨μ¨μ μΌλ‘ νμ©
μ΄ ν¨ν΄μ λ¨μΌ μ€λ λ λΈλ‘ ν¬κΈ°λ₯Ό μ΄κ³Όνλ λκ·λͺ¨ λ°μ΄ν°μ μ²λ¦¬μ κΈ°μ΄κ° λ©λλ€.