모든 GPU computation의 여정 — 한 번 외우면 평생 씀
Host 메모리에서 검증된 결과까지 GPU computation은 항상 같은 박스 9개 통과해. GEMM이 새 박스 추가 안 해 — 기존 거 더 크고 바쁘게 만들 뿐.
| 단계 | 할 일 | CUDA | Metal (unified memory가 단순화) |
|---|---|---|---|
| 1 | Host 메모리 할당 | malloc / std::vector | Swift Array 또는 step 3에서 처리 |
| 2 | 입력 데이터 초기화 | loop / std::iota / RNG | 동일 |
| 3 | Device 메모리 할당 | cudaMalloc | device.makeBuffer(.storageModeShared) |
| 4 | Host → Device 복사 | cudaMemcpyAsync | no-op (buffer에 바로 write) |
| 5 | 커널 정의 | __global__ void kernel | kernel void kernel |
| 6 | 커널 launch | kernel<<<G,B>>>() | encoder.dispatchThreadgroups |
| 7 | Device → Host 복사 | cudaMemcpyAsync back | no-op (같은 buffer에서 read) |
| 8 | 검증 | host loop / thrust::equal | Swift loop |
| 9 | Garbage-collect | cudaFree + free | buffer = nil (ARC 처리) |
Apple Silicon에선 unified memory 때문에 step 4랑 7이 no-op (Track 2 다룸). 개념적 단계는 여전히 존재 — 비용이 0일 뿐. 멘털 모델에서 빼지 마; 나중에 CUDA 코드 읽을 때 고마워할 거.
진짜 production 복잡함은 step 6 (launch geometry 선택)이랑 step 8 (어느 검증 전략: memcmp, thrust::equal, CPU reference 대비 numpy.allclose, FP에 대한 numerical-tolerance 비교)에 숨어.