RAM 풀 하나, 프로세서 둘이 주소 매김
NVIDIA discrete GPU랑 Apple Silicon 사이 가장 중요한 architectural 차이는 peak FLOPs도 vendor 충성도도 아니야. 데이터가 어디 사느냐야.
| 시스템 | CPU 메모리 | GPU 메모리 | 전송 |
|---|---|---|---|
| RTX 4090 데스크탑 | 64 GB DDR5 | 24 GB GDDR6X | PCIe 4.0 ×16, ~32 GB/s |
| Mac Studio M3 Ultra (512 GB) | 512 GB LPDDR5X (공유) | 0 — 같은 RAM | |
데스크탑은 cudaMalloc으로 GPU에 할당하고 PCIe로 데이터 복사. CPU랑 GPU가 자기 DRAM 따로 가지고 32 GB/s 파이프로 만나는데, inference 병목 자주 여기서 나.
Apple Silicon은 SoC가 CPU 코어 + GPU 코어 + DRAM 컨트롤러를 하나의 메모리 서브시스템 뒤에 통합해. device.makeBuffer(length:options:)를 storageModeShared로 부르면 CPU가 직접 read/write 가능하고 GPU가 같은 물리 주소로 보는 buffer 돌아와. 복사 0. PCIe 0.
실제 결과:
- 24 GB VRAM에 안 들어가는 모델도 192–512 GB unified memory엔 자주 들어가. Llama 70B FP16 (~140 GB)은 4090에선 offload 없이 불가능, Mac Studio 192 GB에선 trivial.
- cudaMemcpy 사라져. Track 5에서 볼 9단계 GPU 워크플로우가 Apple Silicon에선 7단계로 줄어 — step 4랑 7이 no-op.
- Bandwidth 차이. 4090의 GDDR6X = ~1.0 TB/s, M3 Ultra LPDDR5X = ~820 GB/s. Apple은 byte당 약간 느린데 PCIe 통째 스킵. 순 throughput 자주 이김.
- 진짜 trade-off 하나: 그 bandwidth가 CPU랑 GPU 공유. 둘 다 동시에 두들기면 effective bandwidth 손해. discrete GPU에선 CPU 트래픽이 다른 파이프.
MLX (Apple의 PyTorch 모양 framework)가 다르게 느껴지는 이유도 이거야. mlx.array(np_array)는 byte 안 옮겨 — numpy array가 이미 사는 같은 RAM에 대한 view야.