ceil() → 올림 해주는 함수
이 함수를 사용해 필요한 Grid의 개수를 설정해줄 수 있다.
2D Grid with 2D Block의 index를 찾아갈 때 1차원적으로 배열을 생각하고 찾아갈 수도 있지만
2차원적으로 생각해서 Row와 Col을 각각 구하고 이를 통해 index를 찾아가는 2차원적 방법도 생각해볼 수 있다.
만약 위 그림과 같은 구조에서 index를 찾아간다고 하면
Row(iy)와 Col(ix)를 각각 구한 다음 iy만큼 nCol을 곱하고 ix만큼 더해주면 원하는 index가 된다.
이를 코드로 옮긴다면
iy, ix를 구하는 방법은 다음과 같고
index를 구하는 방법은 결국 다음과 같다.
GPU Architecture (Fermi)
- CUDA core
- Basic processing unit
- 하나의 thread를 처리
- Register, Local memory
- Streaming Multiprocessor (SM)
- 32개의 CUDA core로 구성
- 하나의 thread block을 처리
- Shared memory
- Texture / Cache
Thread Hierarchy & GPU
- Grid / Kernel
- Kernel 실행 시 생성
- GPU를 사용하는 단위
- Block
- 각각 SM에 block들이 배정되어 처리된다.
- Activie block
- 현재 SM에 배정된 block
- 개수는 block 당 자원 사용량에 의해 결정됨(성능에 영향)
- Warp
- 각 block은 wrap 단위로 분할된다.
- 자신만의 execution context를 가진다.(context switching 오버헤드가 굉장히 적다.)
- context : 자신이 하고 있었던 일의 정보
- CUDA/GPU의 context switching은 HW가 수행
- Massive Parallelism for Latency Hiding
- 연산 장치가 낭비되는 것을 방지하려면 누군가 연산을 하고 있을 때 데이터를 가져오고 내가 연산을 하고 있을 때 다른 누군가가 데이터를 가져오는 방식
- context switching overhead가 적기 때문에(0에 가깝기 때문에) 이 방식이 효율적이다.
- Warp divergence
- 한 Wrap 안의 threads들이 다른 분기(branch)를 하는 경우, 분기별로 serial 하게 수행됨
- GPU 알고리즘 성능에 치명적이다.(최대한 분기를 피해야한다.)
'School Study > Multi Core Programming' 카테고리의 다른 글
CUDA Stream & Concurrent Execution (0) | 2019.05.21 |
---|---|
Synchronization in CUDA (0) | 2019.05.21 |
Maximizing Memory Throughput (0) | 2019.05.14 |
CUDA Memory Model (0) | 2019.05.07 |
CUDA Thread (0) | 2019.04.23 |