본문 바로가기
C.W.K.
Lesson 01 of 05 · published

폰 GPU의 습관

~15 min · gpu-uma, tbdr, gpu-cores, bandwidth, stream, measured

Level 0스펙 시트 훑는 사람
0 XP0/91 lessons0/19 achievements
0/100 XP to next level100 XP to go0% complete
"애플 GPU는 슬롯을 잃은 그래픽 카드였던 적이 없어. 메모리 버스를 얻은 폰 GPU였지."

타일 기반, 폰은 다른 걸 감당 못 하니까

외장 카드 전통의 데스크톱 GPU는 모든 삼각형을 파이프라인에 흘려보내고 픽셀을 메모리의 프레임버퍼에 반복해서 쓰면서 프레임을 그려. 그 트래픽을 흡수하는 넓고 뜨거운 메모리 버스에 기대서. 폰 GPU는 그럴 수 없어. 배터리로 도는 칩이 하는 일 중 메모리 트래픽이 제일 비싸거든. 그래서 애플 GPU는 자기가 물려받은 모바일 GPU들처럼 타일 기반 지연 렌더링을 써. 애플 자체 문서 제목이 그대로 말해. "Apple GPU와 타일 기반 지연 렌더링에 맞게 앱을 다듬기". 화면을 타일로 자르고, 타일 하나를 작은 온칩 메모리 안에서 통째로 렌더링하고, 완성된 타일만 밖으로 써. 메인 메모리로 가는 대역폭이 큰 배수로 줄어. 값은 프로그래머한테 다른 습관을 요구한다는 거고, 본능이 메모리를 안 건드리는 것에 맞춰진 GPU가 된다는 거야.

그 본능이 맥으로 그대로 왔어. 같은 온칩 타일 메모리가 연산 작업엔 threadgroup 메모리로 노출되고, 같은 규율, 그러니까 작업 집합을 가까이 두고 DRAM은 한 번만 건드리는 게 잘 짠 Metal 커널이나 MLX 행렬 곱셈이 하는 일이야. 그리고 같은 계보라는 건 애플 GPU한텐 관리할 자기 메모리가 따로 없다는 뜻이야. 원래 없었어. 폰에서 GPU는 언제나 CPU랑 같은 DRAM을 읽었고, 맥의 통합 메모리는 그 배치를 키운 거야. Ultra에선 폰의 채널 두 개 대신 열여섯 개 몫의 버스고, 대역폭 산수로 나온 숫자야(애플은 채널 수가 아니라 대역폭을 공개해. Air의 100 GB/s가 채널 두 개짜리 맞춤이야).

풀이 GPU한테 실제로 내주는 것

스펙 대역폭(1번 트랙)은 메모리가 공급할 수 있는 양이야. GPU 커널이 달성하는 건 다른 숫자고, 디코드를 묶는 건 그 숫자야. 코드 블록이 실험실 맥마다 STREAM 방식으로 그걸 재. 큰 float32 배열, 원소별 덧셈(읽기와 쓰기), 합산(읽기만), 5회 중 최고.

별칭칩스펙덧셈 (읽기+쓰기)합산 (읽기)달성 ÷ 스펙증거
airM3100 GB/s93 GB/s97 GB/s93–97%실측 2026-09-15
pro2023M3 Max40035939190–98%실측
musicM2 Ultra80074073492%실측
officeM3 Ultra81963563878%실측

넷 중 셋은 스펙에 몇 퍼센트 안으로 닿아. 커널 하나치곤 놀랍고, 버스 산수의 정당한 입증이야. M3 Ultra는 안 그래. 스펙의 78%쯤을 내주고, 절대값으로도 자기가 대체한 M2 Ultra보다 적어. 같은 코드, 같은 MLX 빌드에서. 실험 트랙의 디코드 사다리가 반대편에서 같은 걸 보여줘. M2 Ultra가 27B 모델을 M3 Ultra보다 약간 빠르게 디코드해. 이 퀘스트는 이유를 몰라. 그럴듯하게 들여다볼 자리는 다이 두 개 위 GPU 코어 여든 개와 메모리 컨트롤러 열여섯 개 사이의 패브릭, 그리고 요청 스트림 하나가 거기 어떻게 퍼지느냐야. 어느 것도 사용자 공간에서 관찰할 수 없고, 애플은 아무것도 공개 안 해. 그래서 이 퀘스트는 비율을 보고하고, 라벨을 붙이고, office의 디코드를 예측할 땐 스펙이 아니라 달성 수치를 써.

코어, 그다음 대역폭, 그다음은 없음

애플 GPU는 코어 수로 설명돼. M3는 10, Max는 40, Ultra는 80. 코어마다 실행 유닛, 레지스터, 그 온칩 메모리의 한 조각이 들어 있어. 렌더링과 프리필엔 코어가 네가 사는 거야. 많을수록 초당 더 많은 픽셀이나 프롬프트 토큰을 처리하고, 실험 트랙에서 M3 Ultra가 M2 Ultra보다 프리필이 앞서는 건 더 새롭고 더 큰 GPU가 드러나는 거야. 디코드엔 메모리 버스를 바쁘게 유지할 만큼만 있으면 코어는 의미를 잃고, 위의 표가 그 버스야. GPU 스펙 시트의 나머지 전부, 클럭, 레이 트레이싱 하드웨어, 메시 셰이더는 진짜지만 언어 모델한텐 상관없어.

Code

stream.py — MLX로 재는 달성 GPU 메모리 대역폭, STREAM 방식·python
#!/usr/bin/env python3
"""stream.py — achievable GPU memory bandwidth, STREAM-style, with MLX.
Two kernels on a large float32 array: an elementwise add (read + write) and a
sum reduction (read only). GB/s = bytes moved ÷ best-of-five seconds."""
import sys, time
import mlx.core as mx

gib = float(sys.argv[1]) if len(sys.argv) > 1 else 4.0
n = int(gib * 2**30 / 4)
a = mx.ones((n,), dtype=mx.float32); mx.eval(a)


def best(fn, runs=5):
    fn(); t_best = 1e9
    for _ in range(runs):
        t = time.perf_counter(); fn(); t_best = min(t_best, time.perf_counter() - t)
    return t_best


t_add = best(lambda: mx.eval(a + 1))          # read n·4 B, write n·4 B
t_sum = best(lambda: mx.eval(mx.sum(a)))      # read n·4 B
info = mx.device_info()
print(f"{info['device_name']:16} array {gib:.0f} GiB  add {2*n*4/t_add/1e9:5.0f} GB/s   sum {n*4/t_sum/1e9:5.0f} GB/s   mlx {mx.__version__}")

# 2026-09-15, mlx 0.32.2, macOS 26.6.2:
# Apple M3         array 2 GiB  add    93 GB/s   sum    97 GB/s   (air, spec 100)
# Apple M3 Max     array 4 GiB  add   359 GB/s   sum   391 GB/s   (pro2023, spec 400)
# Apple M2 Ultra   array 4 GiB  add   740 GB/s   sum   734 GB/s   (music, spec 800)
# Apple M3 Ultra   array 4 GiB  add   635 GB/s   sum   638 GB/s   (office, spec 819)
macOS가 자기가 모는 GPU에 대해 말하는 것·bash
system_profiler SPDisplaysDataType | grep -E "Chipset Model|Total Number of Cores|Metal"
# Chipset Model: Apple M3 Ultra
# Total Number of Cores: 80
# Metal Support: Metal 4

python -c "import mlx.core as mx; print(mx.device_info())"
# {'device_name': 'Apple M3 Ultra', 'max_recommended_working_set_size': 498216206336,
#  'memory_size': 549755813888, 'architecture': 'applegpu_g15d', ...}

External links

Exercise

네 맥에서 stream.py를 세 번 돌려(배열 크기는 메모리의 4분의 1 훨씬 아래로) 최고 덧셈·합산 수치를 스펙 옆에 카드에 추가해. 달성 ÷ 스펙을 계산해. 그다음 물리 트랙의 디코드 상한 공식(대역폭 ÷ 토큰당 바이트)으로, 토큰당 4.47 GB를 읽는 모델(실험실의 4비트 9B)의 디코드 상한을 스펙으로 한 번, 네 달성 수치로 한 번 예측하고 둘 다 보관해. 어느 쪽이 더 가까웠는지는 실험 트랙이 말해줘.
Hint
비율이 90% 위면 네 맥은 다수파야. 78% 근처면 아마 M3 Ultra고, 이 퀘스트가 설명 못 한 발견을 방금 재현한 거야. mlx 버전을 적어둬. 나중 릴리스가 바꿀 수도 있으니까.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인 — 댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.