본문 바로가기

dev_AI_framework

cuda 파일의 block_size

CUDA 에서의 block size 는 각 블록 안에서 실행되는 스레드의 배열 크기를 정의,

CUDA 병렬 프로그래밍의 핵심 개념 중 하나, GPU 에서 병렬 처리를 수행하기 위한 기본 구성 단위

 

CUDA 실행 모델 요약

CUDA 는 Grid-Block-Thread 모델을 사용하여 병렬 처리를 구성한다.

Thread : 병렬 작업을 수행하는 최소 단위

Block : 여러 스레드로 구성된 구조

Grid : 여러 블록으로 구성된 상위 구조

 

Block size 정의

Block size 는 각 블록 안에 있는 스레드의 배열 크기를 나타낸다.

dim3 blockDim(16, 16); // blockDim.x = 16, blockDim.y = 16

이 경우, 각 블록은 256 개의 스레드를 포함한다.

 

Block size 와 Gride size 관계

Grid size 는 블록의 배열 크기를 나타낸다. 

dim3 gridDim((cols + blockDim.x - 1) / blockDim.x, 
             (rows + blockDim.y - 1) / blockDim.y);

 

Block size 선택 시 고려사항

GPU 하드웨어 제약, 블록의 최대 크기는 1024 스레드로 제한

작업 크기와 효율성 : 너무 작은 블록은 병렬화 이점을 감소시키고, 너무 큰 블록은 자원 경합을 초래할 수 있다.

메모리 접근 패턴 : 스레드가 메모미를 효율적으로 액세스하도록 block size 를 선택해야 한다.

 

dim3 blockDim(16, 16); // 각 블록에 256개의 스레드
dim3 gridDim((cols + blockDim.x - 1) / blockDim.x, 
             (rows + blockDim.y - 1) / blockDim.y);

blockDim = (16,16) 한 블록이 256 개의 스레드를 처리

Grid 는 cols 와 rows 에 따라 동적으로 계산된다.

각 스레드는 행렬의 특정 원소를 계산한다.

 

병렬 처리

스레드가 많을수록 병렬성이 증가하여 GPU 의 성능을 극대화할 수 있다.

블록이 많아지면 전체 작업을 여러 블록으로 나누어 효율적으로 처리한다.

 

스레드 - 블록 - 그리드

 

블록 사이즈 설정 원칙

GPU 하드웨어 제약 조건 확인

블록 사이즈는 2의 거듭제곱 값을 사용하는 것이 일반적, GPU 하드웨어에서 메모리 접근 효율성을 높여준다.

 

작업 크기에 따라 Grid 와 Block 계산

전체 작업 크기는 Grid 와 Block 으로 분할된다. 블록 크기가 너무 작으면 많은 Grid 가 필요하고 오버헤드가 커진다. 블록 크기가 너무 크면 GPU 의 스레드 활용도가 낮아진다.

 

워프 단위 최적화

GPU 의 기본 실행 단위는 워프로 하나의 워프는 32개의 스레드로 구성

스레드 수가 32의 배수일 경우 워프 효율성이 높아짐