CUDA - 3장. CUDA 기본 개념
2025. 3. 28. 20:30ㆍFramework/CUDA
📘 3장. CUDA 기본 개념
🎯 학습 목표
이 장에서는 CUDA 프로그래밍의 핵심 구조와 개념을 학습합니다.
CUDA가 어떤 방식으로 병렬 연산을 수행하는지 이해하고, 커널 함수 실행, 메모리 구조, 실행 단위를 익히는 것이 목표입니다.
3.1 CUDA 프로그램의 구조
CUDA 프로그램은 CPU(호스트)와 GPU(디바이스)가 각자의 역할을 분담해 함께 연산을 수행합니다.
🔁 기본 흐름
cudaMalloc(); // GPU 메모리 할당
cudaMemcpy(); // 데이터 전송 (Host → Device)
myKernel<<<grid, block>>>(...); // GPU에서 커널 실행
cudaMemcpy(); // 결과 복사 (Device → Host)
cudaFree(); // GPU 메모리 해제
📌 구성 요소
구성 요소 | 설명 |
호스트 코드 | CPU에서 실행 (메모리 할당, 커널 호출 등) |
디바이스 코드 | GPU에서 실행 (병렬 함수, 커널 함수 등) |
커널 함수 | GPU에서 병렬로 실행되는 함수 (__global__) |
3.2 호스트(Host)와 디바이스(Device)의 개념
CUDA에서는 CPU와 GPU를 논리적으로 구분하며, 각각의 메모리 공간도 분리되어 있습니다.
구분 | 구성 | 역할 |
호스트 (Host) | CPU + 시스템 메모리 | 프로그램 제어, 커널 호출 |
디바이스 (Device) | GPU + 디바이스 메모리 | 병렬 연산 수행, 커널 실행 |
🔄 데이터 이동 흐름
- 연산 전: cudaMemcpy(host → device)
- 연산 후: cudaMemcpy(device → host)
⚠️ 호스트와 디바이스는 메모리를 공유하지 않기 때문에, 명시적 복사 작업이 필요합니다.
3.3 CUDA 실행 모델
CUDA는 병렬 연산을 위해 Grid → Block → Thread 구조를 사용합니다.
🔺 계층 구조
Grid
├ Block (0)
│ ├ Thread (0~255)
├ Block (1)
│ ├ Thread (0~255)
🔢 실행 예시
myKernel<<<dim3(2), dim3(256)>>>();
- 총 2개의 블록
- 각 블록에 256개의 스레드
📐 다차원 구성
차원 | 예시 |
1D | dim3(256) |
2D | dim3(16, 16) → 256개 |
3D | dim3(8, 8, 4) → 512개 |
🚧 실행 모델 제한
항목 | 제한 |
블록당 최대 스레드 수 | 1024개 |
그리드 차원 | 최대 3차원 (x, y, z) |
블록 차원 | 최대 3차원 (x, y, z) |
💡 그리드, 블록, 스레드 인덱스는 threadIdx, blockIdx, blockDim으로 접근합니다.
3.4 CUDA 메모리 모델
CUDA는 다양한 메모리 공간을 활용해 병렬 연산 성능을 극대화합니다.
메모리 종류 | 특징 | 사용 대상 |
전역 메모리 | 전체 스레드 접근 가능, 느림 | 주 데이터 저장 |
공유 메모리 | 블록 내 공유, 빠름 | 블록 간 협업 연산 |
레지스터 | 스레드 전용, 매우 빠름 | 임시 변수 |
상수 메모리 | 읽기 전용, 빠른 접근 | 불변 파라미터 |
텍스처 메모리 | 2D/3D 최적화, 캐시 기반 | 이미지/보간 연산 |
📌 메모리 사용 예시
__shared__ float temp[256]; // 공유 메모리
__constant__ float config[16]; // 상수 메모리
float result = a * b; // 레지스터
output[idx] = result; // 전역 메모리
3.5 커널 함수와 실행 방식
🧬 커널 함수 정의
__global__ void myKernel(float* data, int size) {
int idx = threadIdx.x + blockIdx.x * blockDim.x;
// ✅ 경계 검사 필수
if (idx < size) {
data[idx] *= 2.0f;
}
}
▶️ 커널 실행
int threadsPerBlock = 256;
int numBlocks = (size + threadsPerBlock - 1) / threadsPerBlock;
myKernel<<<numBlocks, threadsPerBlock>>>(deviceData, size);
3.6 동기화와 워프(Warp) 개념
🔗 동기화 함수
__syncthreads(); // 블록 내 모든 스레드가 동기화 지점에 도달할 때까지 대기
💡 공유 메모리 사용 시 스레드 간 데이터 충돌 방지를 위해 필수입니다.
🧩 워프(Warp)란?
- 32개의 스레드로 구성된 실행 단위
- 한 번에 한 워프 단위로 명령어가 실행됨
- 워프 내 스레드가 서로 다른 조건문을 수행하면(divergence) 성능 저하 발생 가능
📌 이것만 기억하세요! (핵심 요약)
- CUDA 프로그램은 CPU와 GPU가 함께 작동합니다.
- Grid → Block → Thread 구조로 병렬 작업이 이뤄집니다.
- GPU에는 여러 종류의 메모리가 있으며, 성능에 큰 영향을 줍니다.
- 커널 함수는 __global__로 정의하고 <<<>>> 구문으로 실행합니다.
- 경계 검사, 동기화, 워프 개념을 이해하면 더 안정적이고 빠른 프로그램을 작성할 수 있습니다.
🧾 장 요약표
항목 | 핵심 내용 요약 |
프로그램 구조 | 메모리 할당 → 데이터 전송 → 커널 실행 |
호스트/디바이스 | 서로 다른 실행/메모리 공간 |
실행 모델 | 계층적 구조 (Grid-Block-Thread) |
메모리 모델 | 전역, 공유, 레지스터, 상수, 텍스처 |
커널 함수 | 병렬 연산 함수, __global__로 정의 |
동기화 | __syncthreads()로 스레드 정렬 |
워프 | 32개의 스레드로 구성된 실행 단위 |
'Framework > CUDA' 카테고리의 다른 글
CUDA - 5장. CUDA 최적화 기법 (0) | 2025.03.28 |
---|---|
CUDA - 4장. CUDA 프로그래밍 기본 (0) | 2025.03.28 |
CUDA - 2장. CUDA 개발 환경 설정 (0) | 2025.03.28 |
CUDA - 1장. CUDA 개요 (0) | 2025.03.28 |
CUDA란? (0) | 2025.01.19 |