안녕하세요! 오늘은 CUDA의 처리 구조에 대해 포스팅을 하겠습니다.
CUDA 처리 구조
GPU는 대량의 스레드를 이용하기 때문에 병렬처리를 하기 위한 프로세스의 로드 밸런싱(작업 분할)에 따라 큰 성능 차이가 나타납니다. CUDA에서는 처리영역을 분할하기위해 그리드, 블록, 스레드을 인덱싱하여 처리영역을 구분합니다.
다음 그림과 같이 쿠다는 가장 작은 처리단위인 스레드, 스레드의 집합을 블록, 블록의 집합을 그리드로 구성되며 SIMT(Single Instruction Multiple Thread)구조로 명령이 수행됩니다. 이는 영어 그대로 한 번의 명령으로 대량의 스레드를 처리하기 위한 구조입니다. 병렬처리 프로세스인 SIMD방식과 유사합니다.
CPU 병렬처리와 유사한 점으로 결국은 스레드에서 처리된다는 점입니다. 그리드, 블록은 결국 스레드를 관리하기 쉽게 인덱싱을 위한 용도로 사용한다고 생각하시면 편할 것 같습니다.(물론 성능을 고려하기 위해선 물리적인 것도 생각하셔야합니다.)
그리드, 블록, 스레드를 구분짓는 이유
1. 해당 그리드, 블록, 스레드의 인덱싱을 위해
-> 그리드, 블록, 스레드의 인덱싱을 통해 처리 영역을 분할합니다.
(CUDA 커널 내부에서 threadIdx.x, threadIdx.y 등 인덱싱 정보를 얻어올 수 있습니다.)
2. 접근할 수 있는 메모리가 다름
-> 메모리별 특징에 따라 성능의 차이가 매우 크게 나타납니다.
3. 추후 작성 예정
CUDA 인덱싱을 위한 정의어 |
threadIdx : 스레드 인덱스 값을 얻어옵니다. blockIdx : 블록의 인덱스 값을 얻어옵니다. blockDim : 블록에서 수행되는 스레드 개수 gridDim : 그리드에서 수행되는 블록의 개수 warpSize : 병렬처리 수행단위 |
####################################################################
#20200503 Warp추가 작성
Warp
병렬처리되는 수행 단위로 병렬처리의 최적화 과정에서 고려되어야합니다. 제가 사용해본 NVIDA GPU 1050TI의 경우 32개 스레드 단위로 명령을 수행됩니다. Warp를 구분 짓는 이유 중 동일 워프의 스레드는 전역 메모리 접근 시 메모리 통합 접근이 가능하여 메모리 I/O의 접근 지연시간이 매우 단축됩니다.
예시)
1. 1050TI는 768개의 Nvidia Core를 가집니다.(이전 글)
2. 프로세스에서 kernelFunc<<<128, 64>>>()를 통해 128 X 64 = 8,192개의 스레드를 생성해줍니다.
3. GPU에서 스케줄링을 통해 32개의 스레드 단위로 처리가 수행됩니다
- 가장 기초적인 이론만으로는 768개 ÷ 32 = 24개씩 수행이 되며 8,192 ÷ 32 = 256번 수행되는 것으로 보이네요(물론 더욱 다양한 개념까지 생각한다면 다른 결과가 나오겟죠??)
SP, SM
SP(Scalar Processor)와 SM(Streaming Multiprocessor)는 GPU의 처리에 대해 구조적를 알기 위한 것 같습니다. 아래 그림과 같이 표현될 수 있으며 SM은 SP의 집합입니다. 아래 그림은 이는 가장 기본적인 것으로 보이며 저도 미흡한 부분이 있기 때문에 다른 포스팅을 남깁니다ㅠㅠ
- 쉽게 풀어 쓰셔서 내용 숙지에 좋은 것 같네요
https://wonjayk.tistory.com/96
- CUDA의 병렬처리 아키텍처에 따라 SM과 SP를 상세히 쓰셨더군요
'GPGPU > CUDA' 카테고리의 다른 글
CUDA 설치 및 설치 실패 대처 (0) | 2022.02.18 |
---|---|
CUDA Host<->Device cudaHostGetDevicePointer (0) | 2020.10.27 |
CUDA란? (0) | 2019.12.30 |
GPU 하드웨어 특징 (0) | 2019.11.11 |
GPGPU란? (0) | 2019.11.08 |