Streaming Multiprocessors and Warps
GPU 하드웨어의 특징을 이해하여 최적화를 촉진하는 방법을 살펴보자. Streaming Multiprocessors(SMs)를 알고 나면, 지금까진 작업해온 응용 프로그램을 더욱 최적화할 수 있다.
CUDA 어플리케이션이 실행되는 GPU들에는 Streaming Multiprocessor라는 처리 장치가 있는데, Kernel을 실행하는 동안 thread들을 구성하는 block들이 SM에 전달되어 실행하도록 구성된다. 여기에서 GPU가 가능한한 많은 병렬 처리를 수행하도록 하기 위해, 주어진 GPU 장치에서 SM 수의 배수가 되는 블록의 수를 grid 크기로서 선택함으로써 성능을 향상시킬 수 있다.
또한, SM은 warps라고 불리는 block 내에서 32 개의 thread로 구성된 group들을 생성, 관리, 스케쥴링, 그리고 실행한다. Block 크기를 선택하는 데 있어 스레드의 수를 32의 배수로 선택하는 것이 성능 향상에 도움이 된다는 것을 알고 넘어가는 것이 중요하다.
Programmatically Querying GPU Device Properties
GPU의 SM 수는 사용중인 특정 GPU에 따라 다를 수 있으므로, SM 수는 소스 코드에 하드 코딩되어서는 안된다. 대신에, 이러한 정보는 프로그래밍 방식으로 획득되어야 한다.
아래의 소스 코드는 CUDA C/C++에서 현재 활성화된 GPU 장치에 대한 많은 속성을 포함(SM의 수 등)하는 C 구조체를 얻는 방법을 보여준다.
int deviceId;
cudaGetDevice(&deviceId); // `deviceId` now points to the id of the currently active GPU.
cudaDeviceProp props;
cudaGetDeviceProperties(&props, deviceId); // `props` now has many useful properties about
// the active GPU device.
아래 링크에서는 cudaDeviceProp 구조체가 제공하는 다양한 변수들에 대해 확인할 수 있다.
docs.nvidia.com/cuda/cuda-runtime-api/structcudaDeviceProp.html#structcudaDeviceProp
CUDA Runtime API :: CUDA Toolkit Documentation
Maximum dimensions (width, height, pitch) for 2D textures bound to pitched memory
docs.nvidia.com
'연구개발 > C, C++, CUDA' 카테고리의 다른 글
[CUDA] Asynchronous Memory Prefetching (0) | 2020.10.12 |
---|---|
[CUDA] Unified Memory (UM) (0) | 2020.10.08 |
[CUDA] Error Handling (오류 처리) (0) | 2020.10.06 |
[CUDA] 필요 Thread 수와 Block Configuration이 불일치 할 때 (0) | 2020.10.06 |
[CUDA] 메모리 할당 (Memory Allocation) 기초 (0) | 2020.10.06 |