CUDA 작동원리 알아보기

  • 하나의 Instruction이 여러개의 Threads들을 관리합니다.
  • Threads들이 공유하는 코드를 Kernel이라고 합니다. ex)__global__ 함수
  • Threads들은 각각의 메모리 공간을 가집니다.

 


Kernel 함수

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 형태로 만들 수 있습니다.

 


Grid, block

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

+ Recent posts