Puzzle 2: Zip

κ°œμš”

벑터 a와 벑터 b의 각 μœ„μΉ˜λ₯Ό 더해 output에 μ €μž₯ν•˜λŠ” 컀널을 κ΅¬ν˜„ν•΄ λ³΄μ„Έμš”.

μ°Έκ³ : 각 μœ„μΉ˜λ§ˆλ‹€ μŠ€λ ˆλ“œ 1κ°œκ°€ λ°°μ •λ©λ‹ˆλ‹€.

Zip Zip

핡심 κ°œλ…

이 νΌμ¦μ—μ„œ λ°°μš°λŠ” λ‚΄μš©:

  • μ—¬λŸ¬ μž…λ ₯ λ°°μ—΄μ˜ 병렬 처리
  • μ—¬λŸ¬ μž…λ ₯에 λŒ€ν•œ μš”μ†Œλ³„ μ—°μ‚°
  • λ°°μ—΄ κ°„ μŠ€λ ˆλ“œ-데이터 λ§€ν•‘
  • μ—¬λŸ¬ λ°°μ—΄μ˜ λ©”λͺ¨λ¦¬ μ ‘κ·Ό νŒ¨ν„΄

각 μŠ€λ ˆλ“œ \(i\)에 λŒ€ν•΄: \[\Large output[i] = a[i] + b[i]\]

λ©”λͺ¨λ¦¬ μ ‘κ·Ό νŒ¨ν„΄

Thread 0:  a[0] + b[0] β†’ output[0]
Thread 1:  a[1] + b[1] β†’ output[1]
Thread 2:  a[2] + b[2] β†’ output[2]
...

πŸ’‘ μ°Έκ³ : 이제 μ»€λ„μ—μ„œ μ„Έ 개의 λ°°μ—΄(a, b, output)을 닀루고 μžˆμŠ΅λ‹ˆλ‹€. 연산이 λ³΅μž‘ν•΄μ§ˆμˆ˜λ‘ μ—¬λŸ¬ 배열에 λŒ€ν•œ 접근을 κ΄€λ¦¬ν•˜κΈ°κ°€ 점점 μ–΄λ €μ›Œμ§‘λ‹ˆλ‹€.

μ™„μ„±ν•  μ½”λ“œ

comptime SIZE = 4
comptime BLOCKS_PER_GRID = 1
comptime THREADS_PER_BLOCK = SIZE
comptime dtype = DType.float32


fn add(
    output: UnsafePointer[Scalar[dtype], MutAnyOrigin],
    a: UnsafePointer[Scalar[dtype], MutAnyOrigin],
    b: UnsafePointer[Scalar[dtype], MutAnyOrigin],
):
    i = thread_idx.x
    # FILL ME IN (roughly 1 line)


전체 μ½”λ“œ 보기: problems/p02/p02.mojo

팁
  1. thread_idx.xλ₯Ό i에 μ €μž₯ν•©λ‹ˆλ‹€
  2. a[i]와 b[i]λ₯Ό λ”ν•©λ‹ˆλ‹€
  3. κ²°κ³Όλ₯Ό output[i]에 μ €μž₯ν•©λ‹ˆλ‹€

μ½”λ“œ μ‹€ν–‰

μ†”λ£¨μ…˜μ„ ν…ŒμŠ€νŠΈν•˜λ €λ©΄ ν„°λ―Έλ„μ—μ„œ λ‹€μŒ λͺ…λ Ήμ–΄λ₯Ό μ‹€ν–‰ν•˜μ„Έμš”:

pixi run p02
pixi run -e amd p02
pixi run -e apple p02
uv run poe p02

퍼즐을 아직 ν’€μ§€ μ•Šμ•˜λ‹€λ©΄ 좜λ ₯이 λ‹€μŒκ³Ό 같이 λ‚˜νƒ€λ‚©λ‹ˆλ‹€:

out: HostBuffer([0.0, 0.0, 0.0, 0.0])
expected: HostBuffer([0.0, 2.0, 4.0, 6.0])

μ†”λ£¨μ…˜

fn add(
    output: UnsafePointer[Scalar[dtype], MutAnyOrigin],
    a: UnsafePointer[Scalar[dtype], MutAnyOrigin],
    b: UnsafePointer[Scalar[dtype], MutAnyOrigin],
):
    i = thread_idx.x
    output[i] = a[i] + b[i]


이 μ†”λ£¨μ…˜μ€:

  • i = thread_idx.x둜 μŠ€λ ˆλ“œ 인덱슀λ₯Ό κ°€μ Έμ˜΅λ‹ˆλ‹€
  • 두 λ°°μ—΄μ˜ 값을 λ”ν•©λ‹ˆλ‹€: output[i] = a[i] + b[i]

μ•žμœΌλ‘œ λ‹€λ£° λ‚΄μš©

직접 인덱싱은 κ°„λ‹¨ν•œ μš”μ†Œλ³„ μ—°μ‚°μ—μ„œ 잘 μž‘λ™ν•˜μ§€λ§Œ, λ‹€μŒ 상황을 생각해 λ³΄μ„Έμš”:

  • λ°°μ—΄μ˜ λ ˆμ΄μ•„μ›ƒμ΄ μ„œλ‘œ λ‹€λ₯΄λ‹€λ©΄?
  • ν•œ 배열을 λ‹€λ₯Έ 배열에 λΈŒλ‘œλ“œμΊμŠ€νŠΈν•΄μ•Ό ν•œλ‹€λ©΄?
  • μ—¬λŸ¬ λ°°μ—΄μ—μ„œ 병합(coalesced) 접근을 μ–΄λ–»κ²Œ 보μž₯ν•  수 μžˆμ„κΉŒ?

μ΄λŸ¬ν•œ μ§ˆλ¬Έλ“€μ€ Puzzle 4의 LayoutTensor μ•Œμ•„λ³΄κΈ°μ—μ„œ λ‹€λ£Ήλ‹ˆλ‹€.