대표적인 병렬처리 프로그래밍 기법
- CPU - 복잡한 연산, 단일 성능이 높음 (Clock Speed)
- GPU - 단순한 연산, 단일 성능이 낮음, ALU 동시에 구동 가능, 프로그래밍에 제한이 있음
A는 한 번에 1개의 공을 옮길 수 있고 1초에 한번 작업을 할 수 있다. (Latency : 1, Throughput : 1)
B는 한 번에 4개의 공을 옮길 수 있고 2초에 한번 작업을 할 수 있다. (Latency : 2, Throughput : 2)
(버스와 스포츠가 라고 생각할 수도 있다.)
전력 효율을 높이기 위해서 CPU 는 점점 latency 를 줄여가고 GPU 는 throughput 을 늘려간다.
배열 정보, index는 grid size 와 block size로 정의된다.
- grid size는 block 수, shape로 결정
- block size는 thread 수, shape로 결정
- Grid, Block은 1~3차원이 될수 있다.
- gridDim.{x,y,z} - The dimensions of the grid
- blockDim.{x,y,z} - The deminsions of the block
- blockIdx.{x,y,z} - The index of the current block within the grid
- threadIdx.{x,y,z} - The index of the current thread within the block
- Block 2차원, Thread 3차원으로 구성
1차원 배열일 때, 스레드 구성 | BlockIndex | ThreadIndex |
1차원 | blockIdx.x | blockIdx.x * blockDim.x + threadIdx.x |
2차원 | blockIdx.x | blockIdx.x * blockDim.x * blockDim.y + threadIdx.y * blockDim.x + threadIdx.x |
3차원 | blockIdx.x | blockIdx.x * blockDim.x * blockDim.y * blockDim.z + threadIdx.z * blockD |
- Block 2차원, Trhead 3차원 구성
차원 배열일 때, 스레드 구성 | BlockIndex | ThreadIndex |
1차원 | blockIdx.y * gridDim.x + blockIdx.x | BlockIndex * blockDim.x + threadIdx.x |
2차원 | blockIdx.y * gridDim.x + blockIdx.x | BlockIndex * blockDim.y * blockDim.x + threadIdx.y * blockDim.x + threadIdx.x |
3차원 | blockIdx.y * gridDim.x + blockIdx.x | BlockIndex * blockDim.z * blockDim.y * blockDIm.x + threadIdx.z * blockDim.y * blockDim.z + threadIdx.y * blockDim.x + threadIdx.x |
- 사이즌 어떻게 ? 최적화는 ?
- How many threads are active at one time!!
- Total Threads = Grid 수 X 각 Grid의 Block 수 X 각 Block의 Thread수
CUDA 구조체중 dim3로 grid, block수를 정의한 다음의 kernel의 경우
dim3 dimGrid(5,2,1);
dim3 dimBlock(4,3,6);
gridDim.x = 5 -----------> blockIdx.x = 1.........5
gridDim.y = 2 -----------> blockIdx.y = 1.........2
gridDim.x = 1 -----------> blockIdx.z = 1.........1
blockDim.x = 4, ----------> threadIdx.x = 1....4
blockDim.x = 3, ----------> threadIdx.y = 1....3
blockDim.x = 6, ----------> threadIdx.z = 1....6
blockDim.x = 4 ,
5*2*1*4*3*6 = 720
[Ref]
GPU Programming( 왜 GPU를 사용하는가 )