CUDA 작동원리 알아보기
- 하나의 Instruction이 여러개의 Threads들을 관리합니다.
- Threads들이 공유하는 코드를 Kernel이라고 합니다. ex)__global__ 함수
- Threads들은 각각의 메모리 공간을 가집니다.
Kernel 함수
모든 스레드가 이 코드를 똑같이 실행합니다.
각각 자기만의 데이터를 다루기 위해 자신의 아이디=tID (위치)를 가져와서 실행합니다.
Thread의 계층구조
- Thread: 기본적으로 연산을 수행하는 기본 단위
- Warp:
- 32개의 Threads들의 집합
- 하나의 Instruction에 의해 작동
- Block:
- Warp들의 집합
- 하나의 블럭안에 있는 Thread들은 자신 고유의 ID값을 갖습니다. ex) threadidx
- 1D, 2D, 3D 형태로 만들 수 있습니다.
- Grid:
- Block들의 집합
- 하나의 Grid안에서는 Block들이 서로 다른 ID를 갖는다. ex_blockidx
- 1D, 2D, 3D 형태로 만들 수 있습니다.
CUDA에 기본적으로 내장되어 있는 변수.
- gridDim:
- Grid안의 block 수 결정
- blockIdx:
- Block ID of current thread
- blockDim:
- block 안의 thread 수 결정
- threadIdx:
- block 안에서 자신의 thread ID 값
Dimension 설정해주기
- dimGrid(4, 1, 1): x축 - 4, y축 - 1, z축 - 1 즉, 4개의 1D형태의 Grid
- dimBlock(8, 1, 1): x축 - 8, y축 - 1, z축 - 1 즉, 8개의 1D형태의 block
코드로 사이즈 알아보기
위의 dim3 block(), dim3 grid() 는 CUDA에서 제공해주는 기능입니다.
dim3 block(3), dim3 grid(2) 이건 아래의 그림과 같은 형태를 띄게 됩니다.
※ block(3), grid(2)와 같이 정수 하나면 입력할 경우 (3) -> (3, 1, 1), (2) -> (2, 1, 1) 이 됩니다.
즉, Grid 안에는 2개의 block이 존재하고 block 안에는 3개의 thread가 존재합니다.
이제 Kernel을 정의해 줍니다.
- threadIdx: block안의 thread의 위치
- blockIdx: grid안의 block의 위치
- blockDim: block의 사이즈
- gridDim: grid의 사이즈
출력의 결과입니다.
출처:
https://www.youtube.com/watch?v=my1U4QY59Bg&list=PLBrGAFAIyf5pp3QNigbh2hRU5EUD0crgI&index=17
'Cuda' 카테고리의 다른 글
07_GPU_HardWare_CUDA (0) | 2021.08.30 |
---|---|
06_Where_is_Thread_CUDA (0) | 2021.08.30 |
04_Vector_Sum_CUDA (0) | 2021.08.27 |
03_Hello_CUDA_(Colab에서 CUDA 설정하기) (0) | 2021.08.26 |
02_용어정리_CUDA (0) | 2021.08.26 |