CUDA 소프트웨어 스택
개요
CUDA(Compute Unified Device Architecture)는 NVIDIA가 개발한 병렬 컴퓨팅 플랫폼으로, GPU를 범용 계산(GPGPU)에 활용할 수 있는 소프트웨어 스택을 제공합니다. 2007년 첫 출시 이후 HPC(High Performance Computing), 딥러닝, 과학 계산, 이미지 처리 등 다양한 분야에서 표준으로 자리잡았습니다.
CUDA 소프트웨어 스택은 하드웨어(GPU)와 애플리케이션 사이에 위치하며, 개발자가 효율적으로 GPU 리소스를 활용할 수 있는 컴파일러, 런타임, 라이브러리, 개발 도구를 포괄적으로 제공합니다. 최신 CUDA 13.x 버전은 Blackwell 아키텍처를 지원하며, FP8/FP4 같은 낮은 정밀도 데이터 타입과 Grouped GEMM 같은 고급 연산을 통해 AI 추론 성능을 극대화합니다.
핵심 개념
스택 계층 구조
CUDA 소프트웨어 스택은 크게 4개의 계층으로 구성됩니다:
1. 하드웨어 계층 (GPU)
- NVIDIA GPU의 병렬 처리 아키텍처
- Streaming Multiprocessor(SM) 기반 실행 모델
- Compute Capability에 따른 기능 지원 범위 결정
2. 드라이버 및 런타임 계층
- NVIDIA GPU 드라이버: 하드웨어와 소프트웨어 사이의 인터페이스
- CUDA 런타임(cudart): 메모리 관리, 커널 실행, 동기화 등 기본 API 제공
- 드라이버는 하위 호환성을 유지하여 이전 버전 CUDA로 컴파일된 앱 실행 지원
3. 컴파일러 및 도구 계층
- NVCC(NVIDIA CUDA Compiler): CUDA C++ 코드를 PTX(병렬 쓰레드 실행) 및 SASS(이진 코드)로 컴파일
- NVRTC(NVIDIA Runtime Compilation): 런타임에 PTX를 JIT 컴파일
- cuobjdump, nvdisasm: 바이너리 분석 및 디스어셈블리 도구
4. 라이브러리 계층 (CUDA-X Libraries)
- cuBLAS: 선형대수(BLAS) 연산 가속
- cuFFT: 푸리에 변환 가속
- cuDNN: 딥러닝 뉴럴 네트워크 연산 가속
- cuSPARSE: 희소 행렬 연산 가속
- cuSOLVER: 선형 시스템 해결 및 고유값 분해
프로그래밍 모델
커널(Kernel) 실행 모델
- 호스트(CPU)에서 커널 함수를 호출하면 수천 개의 스레드가 병렬 실행
- Thread Hierarchy: Thread → Warp(32 스레드) → Block → Grid
- 블록 내 스레드는 Shared Memory와 __syncthreads()로 동기화
메모리 계층
- Global Memory: 모든 스레드가 접근 가능, 높은 레이턴시
- Shared Memory: 블록 내 스레드 공유, 빠른 접근
- Constant/Texture Memory: 읽기 전용 캐시
- Local Memory: 레지스터 공간 초과 시 자동 사용
동기화 메커니즘
- __syncthreads(): 블록 내 스레드 동기화
- cudaDeviceSynchronize(): 호스트-디바이스 동기화
- CUDA Stream: 커널 간 순서 보장 및 비동기 실행
주요 데이터 타입 지원
| 데이터 타입 | 용도 | 특징 |
|---|---|---|
| FP32 | 범용 계산 | 정밀도 높음, 범용적 |
| FP16 | 딥러닝 훈련/추론 | 메모리 절반, 처리량 2배 |
| BF16 | 딥러닝 훈련 | FP16 범위, FP32 정밀도 |
| FP8 (E4M3/E5M2) | AI 추론 | 메모리 1/4, 처리량 4배 |
| FP4 (NVFP4) | 고성능 추론 | 메모리 1/8, 처리량 8배 |
| TF32 | 딥러닝 훈련 | FP32 범위, FP16 정밀도 |
| INT8 | 추론 양자화 | 메모리 1/4, 정수 연산 |
비교/분석
CUDA vs 다른 GPU 프로그래밍 플랫폼
| 특성 | CUDA | ROCm (AMD) | OpenCL | Vulkan Compute |
|---|---|---|---|---|
| 하드웨어 지원 | NVIDIA 전용 | AMD 전용 | 범용 | 범용 |
| 성능 | 최적화됨 | NVIDIA 대비 80-90% | 벤더별 차이 | 게임 특화 |
| 라이브러리 생태계 | 풍부 (cuDNN, cuBLAS 등) | MIOpen, rocBLAS | 제한적 | 제한적 |
| 개발 도구 | Nsight, Compute Sanitizer | rocprof, rocminfo | 벤더별 | Vulkan SDK |
| 딥러닝 프레임워크 | PyTorch, TensorFlow 공식 지원 | PyTorch 공식 지원 | 제한적 | 비실용적 |
| 학습 자료 | 풍부 | 제한적 | 중간 | 게임 특화 |
CUDA 툴킷 버전별 주요 특징
| 버전 | 출시 | 주요 특징 |
|---|---|---|
| CUDA 11.0 | 2020 | A100 지원, MIG, 3차원 그래프 |
| CUDA 12.0 | 2022 | H100 지원, 그래프 리팩터링, TMA |
| CUDA 13.0 | 2025 | Blackwell 지원, FP4, Grouped GEMM |
| CUDA 13.3 | 2025 | Tile Programming, ARM 통합 |
주요 라이브러리 성능 비교
cuBLAS GEMM 성능 (Hopper/Blackwell)
- FP32 TF32: Hopper 대비 Blackwell 27% 향상
- FP8: Blackwell에서 4배 처리량
- NVFP4: Blackwell Ultra에서 최대 3.5배 가속
- Grouped GEMM: 대규모 문제에서 최대 20% 성능 향상
cuFFT 변환 성능
- 2의 거듭제곱 크기: Blackwell에서 크게 향상
- 단일/이중 정밀도 모두 지원
- LTO(Link-Time Optimization)로 커널 최적화
동작 원리
CUDA 프로그래밍 흐름
1. 호스트 메모리 할당 및 데이터 전송
cudaMalloc() → cudaMemcpy(H→D)
2. 커널 실행 설정
dim3 grid(N/blockSize)
dim3 block(blockSize)
3. 커널 실행
kernel<<<grid, block>>>(args)
4. 결과 호스트로 복사
cudaMemcpy(D→H) → cudaFree()
커널 실행 모델 상세
** 스케줄링 과정**
1. 호스트에서 커널 호출 시 CUDA 런타임이 GPU에 전달
2. GPU 스케줄러가 블록을 SM에 배치
3. 각 SM이 블록의 워프(32 스레드)를 병렬 실행
4. 워프 스키핑(Warp Scheduling)으로 레이턴시 숨김
메모리 접근 패턴
- Coalesced Access: 인접 스레드가 인접 메모리 접근 시 최적화
- Bank Conflict 회피: Shared Memory 접근 시 충돌 방지
- Shared Memory Tiles: 데이터 재사용 극대화
컴파일 과정
CUDA C++ (.cu)
↓ NVCC
PTX (병렬 쓰레드 실행 코드)
↓ JIT 컴파일 또는 구버전 호환
SASS (이진 기계어)
↓ 실행
GPU 하드웨어
동기화 및 스케줄링
CUDA Stream
- 커널 실행 순서 보장
- 비동기 실행으로 호스트-디바이스 병렬화
- 기본 스트림과 사용자 정의 스트림 구분
이벤트(Event) 동기화
- cudaEventRecord(): 타이밍 측정
- cudaEventSynchronize(): 특정 시점 동기화
- 그래프(Graph) 내 의존성 관리
장단점
장점
- 성능: NVIDIA 하드웨어에서 최적화된 실행
- 생태계: 풍부한 라이브러리와 프레임워크 지원
- 도구: Nsight, Compute Sanitizer 등 강력한 개발 도구
- 호환성: 지속적인 하위 호환성 유지
- 커뮤니티: 방대한 학술 자료와 커뮤니티 지원
- 발전: 매년 새로운 아키텍처와 기능 추가
단점
- 하드웨어 종속: NVIDIA GPU에서만 실행
- 학습 곡선: 병렬 프로그래밍 개념 이해 필요
- 비용: 고성능 NVIDIA GPU 비용
- 전력 소비: 대규모 연산 시 높은 전력 요구
- 이식성: 다른 플랫폼 이식 어려움
관련 기술
표준 및 사양
- NVIDIA CUDA Toolkit Documentation: https://docs.nvidia.com/cuda/
- CUDA C++ Programming Guide: https://docs.nvidia.com/cuda/cuda-c-programming-guide/
- NVIDIA GPU Architecture Whitepapers
주요 참고 문헌
- NVIDIA CUDA Best Practices Guide
- CUDA Memory Optimization Guide
- NVIDIA Deep Learning Performance Guide
- cuBLAS Library Documentation
- cuDNN Developer Guide
관련 문서
핵심 정리
CUDA 소프트웨어 스택은 NVIDIA GPU를 활용한 병렬 컴퓨팅의 표준 플랫폼으로, 하드웨어부터 라이브러리까지 통합된 개발 환경을 제공합니다. 커널 기반 프로그래밍 모델과 멀티레벨 메모리 구조를 통해 효율적인 GPU 활용이 가능하며, cuBLAS/cuDNN 같은 최적화된 라이브러리는 AI/HPC 분야에서 필수적인 성능을 제공합니다. 최신 버전은 FP8/FP4 같은 낮은 정밀도 지원과 Grouped GEMM을 통해 대규모 AI 모델 추론 성능을 극대화하고 있으며, 지속적인 아키텍처 발전과 함께 생태계가 확장되고 있습니다.