-
CUDA 기본 문법: 스레드, 블록, 그리드카테고리 없음 2025. 3. 17. 22:16반응형
CUDA 기본 문법: 스레드, 블록, 그리드 개념 CUDA 기본 문법: 스레드, 블록, 그리드 개념
1. 개요
CUDA는 NVIDIA GPU에서 병렬 처리를 수행할 수 있도록 지원하는 병렬 프로그래밍 모델이다. CUDA에서 병렬 연산을 수행하려면 스레드(Thread), 블록(Block), 그리고 그리드(Grid) 개념을 이해해야 한다.
2. 스레드(Thread)
CUDA에서의 스레드는 GPU에서 실행되는 가장 작은 연산 단위이다. 각 스레드는 독립적으로 실행되며, 특정한 인덱스를 통해 고유한 작업을 수행할 수 있다.
예제: 간단한 CUDA 커널
__global__ void simpleKernel() { int threadID = threadIdx.x; printf("스레드 ID: %d\n", threadID); }위 코드에서
threadIdx.x는 스레드의 인덱스를 나타내며, 각 스레드는 고유한 ID를 가진다.3. 블록(Block)
블록은 여러 개의 스레드로 구성된 단위이다. 하나의 블록 내에서 스레드들은 협력하여 연산을 수행할 수 있다. 블록 내 스레드 수는 최대 1024개까지 설정할 수 있다.
블록 내에서 스레드 식별하기
__global__ void blockKernel() { int threadID = threadIdx.x; int blockID = blockIdx.x; printf("블록 %d의 스레드 %d\n", blockID, threadID); }여기서
blockIdx.x는 블록의 인덱스를 의미하며, 각 블록 안에서 여러 개의 스레드가 실행될 수 있다.4. 그리드(Grid)
그리드는 여러 개의 블록으로 구성된다. 즉, GPU에서 실행되는 전체 연산의 범위를 정의하는 개념이다.
그리드에서 블록과 스레드 식별하기
__global__ void gridKernel() { int threadID = threadIdx.x; int blockID = blockIdx.x; int globalID = blockID * blockDim.x + threadID; printf("글로벌 ID: %d (블록 %d, 스레드 %d)\n", globalID, blockID, threadID); }위 코드에서
blockDim.x는 블록 내 스레드의 개수를 의미하며, 이를 이용해 전체 그리드 내에서의 전역적인 스레드 ID를 계산할 수 있다.5. 실행 방법
CUDA 커널을 실행할 때는 블록과 스레드 개수를 설정해야 한다. 예를 들어, 다음과 같이 호출할 수 있다.
int main() { gridKernel<<<2, 4>>>(); // 2개의 블록, 블록당 4개의 스레드 cudaDeviceSynchronize(); // GPU 실행 완료 대기 return 0; }6. 정리
- 스레드(Thread): GPU에서 실행되는 가장 작은 연산 단위
- 블록(Block): 여러 개의 스레드로 구성된 단위
- 그리드(Grid): 여러 개의 블록으로 구성된 전체 실행 단위
이제 CUDA의 스레드, 블록, 그리드 개념을 이해했으므로, 다음 단계에서는 CUDA 메모리 모델과 최적화 기법에 대해 알아보도록 하자.
반응형