μ–Έμ œ μ›Œν”„ ν”„λ‘œκ·Έλž˜λ°μ„ μ‚¬μš©ν• κΉŒ

λΉ λ₯Έ νŒλ‹¨ κ°€μ΄λ“œ

βœ… μ›Œν”„ 연산을 μ‚¬μš©ν•  λ•Œ:

  • 32개 μ΄μƒμ˜ μš”μ†Œμ— λŒ€ν•œ λ¦¬λ•μ…˜ μ—°μ‚° (sum, max, min)
  • κ·œμΉ™μ μΈ λ©”λͺ¨λ¦¬ μ ‘κ·Ό νŒ¨ν„΄ (인접 레인 β†’ 인접 μ£Όμ†Œ)
  • 크둜슀 μ•„ν‚€ν…μ²˜ 이식성이 ν•„μš”ν•œ 경우 (NVIDIA/RDNA 32 vs CDNA 64 μŠ€λ ˆλ“œ)
  • 더 κ°„λ‹¨ν•˜κ³  μœ μ§€λ³΄μˆ˜ν•˜κΈ° μ‰¬μš΄ μ½”λ“œλ₯Ό 원할 λ•Œ

❌ κΈ°μ‘΄ 방식을 μ‚¬μš©ν•  λ•Œ:

  • λ³΅μž‘ν•œ μ›Œν”„ κ°„ 동기화가 ν•„μš”ν•œ 경우
  • λΆˆκ·œμΉ™ν•˜κ±°λ‚˜ μ‚°λ°œμ μΈ λ©”λͺ¨λ¦¬ μ ‘κ·Ό νŒ¨ν„΄
  • μŠ€λ ˆλ“œλ³„ μž‘μ—…λŸ‰μ΄ λ‹€λ₯Έ 경우 (μ›Œν”„ λΆ„κΈ° λ°œμƒ)
  • 문제 크기가 size < WARP_SIZE인 경우

μ„±λŠ₯ νŠΉμ„±

문제 크기별 ν™•μž₯μ„±

μš”μ†Œ μˆ˜μ›Œν”„ 이점비고
< 32μ—†μŒκΈ°μ‘΄ 방식이 유리
32-1K1.2-1.5배이점이 λ‚˜νƒ€λ‚˜κΈ° μ‹œμž‘
1K-32K1.5-2.5λ°°μ›Œν”„ 연산이 탁월
> 32Kλ©”λͺ¨λ¦¬ λ°”μš΄λ“œμ–‘μͺ½ λͺ¨λ‘ λŒ€μ—­ν­μ— μ˜ν•΄ μ œν•œ

μ›Œν”„μ˜ 핡심 이점

  • 동기화 μ˜€λ²„ν—€λ“œ 제둜: 배리어 λΉ„μš© 제거
  • μ΅œμ†Œν•œμ˜ λ©”λͺ¨λ¦¬ μ‚¬μš©: 곡유 λ©”λͺ¨λ¦¬ ν• λ‹Ή λΆˆν•„μš”
  • μš°μˆ˜ν•œ ν™•μž₯μ„±: μ›Œν”„ μˆ˜κ°€ λŠ˜μ–΄λ‚ μˆ˜λ‘ μ„±λŠ₯ ν–₯상
  • κ°„κ²°ν•œ μ½”λ“œ: 더 적은 쀄 수, 더 적은 였λ₯˜ κ°€λŠ₯μ„±

μ•Œκ³ λ¦¬μ¦˜λ³„ κ°€μ΄λ“œ

μ•Œκ³ λ¦¬μ¦˜κΆŒμž₯ μ‚¬ν•­μ΄μœ 
λ‚΄μ μ›Œν”„ μ—°μ‚° (1K+ μš”μ†Œ)단일 λ¦¬λ•μ…˜, κ·œμΉ™μ  μ ‘κ·Ό
ν–‰λ ¬ ν–‰/μ—΄ ν•©κ³„μ›Œν”„ μ—°μ‚°μžμ—°μŠ€λŸ¬μš΄ λ¦¬λ•μ…˜ νŒ¨ν„΄
λˆ„μ  합항상 prefix_sum() μ‚¬μš©ν•˜λ“œμ›¨μ–΄ μ΅œμ ν™”λœ κΈ°λ³Έ μš”μ†Œ
풀링 (max/min)μ›Œν”„ μ—°μ‚° (κ·œμΉ™μ  μœˆλ„μš°)효율적인 μœˆλ„μš° λ¦¬λ•μ…˜
ꡬ간이 λ§Žμ€ νžˆμŠ€ν† κ·Έλž¨κΈ°μ‘΄ λ°©μ‹λΆˆκ·œμΉ™ν•œ μ“°κΈ°, μ›μžμ  μ—…λ°μ΄νŠΈ

μ½”λ“œ μ˜ˆμ‹œ

βœ… μ›Œν”„μ— μ ν•©ν•œ 경우

# λ¦¬λ•μ…˜ μ—°μ‚°
from gpu.primitives.warp import sum, max
var total = sum(partial_values)
var maximum = max(partial_values)

# 톡신 νŒ¨ν„΄
from gpu.primitives.warp import shuffle_idx, prefix_sum
var broadcast = shuffle_idx(my_value, 0)
var running_sum = prefix_sum(my_value)

❌ κΈ°μ‘΄ 방식이 λ‚˜μ€ 경우

# λ³΅μž‘ν•œ 닀단계 동기화
stage1_compute()
barrier()  # λͺ¨λ“  μŠ€λ ˆλ“œκ°€ μ™„λ£Œλ  λ•ŒκΉŒμ§€ λŒ€κΈ°
stage2_depends_on_stage1()

# λΆˆκ·œμΉ™ν•œ λ©”λͺ¨λ¦¬ μ ‘κ·Ό
var value = input[random_indices[global_i]]  # μ‚°λ°œμ  읽기

# 데이터 의쑴적 μž‘μ—…
if input[global_i] > threshold:
    result = expensive_computation()  # μ›Œν”„ λΆ„κΈ° λ°œμƒ

μ„±λŠ₯ μΈ‘μ •

# 항상 μ–‘μͺ½ 방식을 λ²€μΉ˜λ§ˆν¬ν•˜μ„Έμš”
mojo p22.mojo --benchmark

# ν™•μž₯ νŒ¨ν„΄μ„ ν™•μΈν•˜μ„Έμš”:
# traditional_1x:  X.XX ms
# warp_1x:         Y.YY ms  # 더 빨라야 함
# warp_32x:        Z.ZZ ms  # 이점이 컀져야 함

μš”μ•½

μ›Œν”„ μ—°μ‚°μœΌλ‘œ μ‹œμž‘ν•˜μ„Έμš”:

  • κ·œμΉ™μ μΈ μ ‘κ·Ό νŒ¨ν„΄μ„ κ°€μ§„ λ¦¬λ•μ…˜
  • 문제 β‰₯ 1 μ›Œν”„ 크기
  • 크둜슀 ν”Œλž«νΌ ν˜Έν™˜μ„±μ΄ ν•„μš”ν•œ 경우

κΈ°μ‘΄ 방식을 μ‚¬μš©ν•˜μ„Έμš”:

  • λ³΅μž‘ν•œ 동기화가 ν•„μš”ν•œ 경우
  • λΆˆκ·œμΉ™ν•œ λ©”λͺ¨λ¦¬ νŒ¨ν„΄
  • μž‘μ€ 문제 λ˜λŠ” μ‹¬ν•œ λΆ„κΈ°

νŒλ‹¨μ΄ μ–΄λ €μšΈ λ•Œ: μ–‘μͺ½ λͺ¨λ‘ κ΅¬ν˜„ν•˜κ³  λ²€μΉ˜λ§ˆν¬ν•˜μ„Έμš”. μ„±λŠ₯ 차이λ₯Ό 보면 닡이 λ‚˜μ˜΅λ‹ˆλ‹€.