ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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 메모리 모델과 최적화 기법에 대해 알아보도록 하자.

    반응형
Designed by Tistory.