GPU는 AI Application을 빠르게 수행하기 위하여 사용되고 있다. GPU는 어떤 특성을 가지기 때문에 AI Application을 수행하는 데 적합한 지를 알아보도록 하겠다.
GPU를 알아보기 앞서, Performance 측면에서 CPU는 어떤 형태로 발전해왔는 지를 알아보자.
성능에 영향을 주는 요소들은 아래와 같다.
1. Paralleism
2. Clock frequency
3. Memory bandwidth
4. Memory latency
Paralleism은 말그대로 병렬로 수행하는 것을 의미한다. Instruction을 병렬로 수행하기 때문에 ILP(Instruction Level Paralleism)이라고 한다. CPU는 여러 Core를 구비하고, 각 Core마다 ILP를 수행한다.
Clock frequency는 CPU의 동작 속도를 말하며, 현재는 Power 소모 이슈로 더 이상 증가되고 있지 않다.
Memory bandwidth는 한번에 얼마나 많은 양의 데이터를 가지고 있는 지에 대한 지표이다. 현재 CPU는 Main memory로 DDR Memory를 사용하고 있고, 제한적인 Bandwidth를 가지고 있다.
Memory latency는 DDR Memory의 latency로 다른 instruction 보다 큰 latency를 가지고 있다. 따라서 이를 감추기 위한 cache, out-of-order execution, SMT(Simultaneous multithreading)을 수행한다.
동일한 관점에서 GPU를 살펴보자.
Paralleism은 병렬 수행을 극대화하기 위해서, 많은 수의 코어를 가지고 있다. 많은 수의 코어를 넣기 위하여 하나의 코어를 작고 간단하게 만들었다. 기존 CPU 대비 Cache/Controller 영역을 줄이고 많은 코어를 넣는데 집중하였다.
Clock frequency는 CPU에 비해 낮은 주파수로 동작하지만, 많은 코어를 이용하여 처리량을 극대화하였다.
Memory bandwidth는 CPU보다 큰 Memory bandwidth를 가진다. GPU는 GDDR 혹은 HBM을 사용한다.
Memory latency는 DDR과 비슷하고, GPU도 마찬가지로 Latency를 감추기 위하여 hardware multithreading 방식을 사용한다.
기본적으로 Graph 관련 Application은 pixel 처리와 같이 간단하고, 독립적으로 수행할 수 있는 Task들로 이뤄져있다. 이 Task들을 가능하면 많이 병렬로 실행하여 성능을 높일 수 있다.
SM(Streaming Multiprocessors)은 하나의 Fetch/Decode logic을 가지고, 여러 ALU를 병렬적으로 동작한다. 즉, SIMD(Single Instrction Multiple Data) 방식을 사용한다.
병렬적으로 수행하는데, Branch를 만날 수도 있다. 이런 경우, Branch가 True인 Thread를 수행하고, 다음 False인 Thread를 수행한다. 복잡한 branch prediction과 같은 기능은 사용하지 않는다. 그렇기 때문에, Thread 간에는 동일한 branch 결과를 가지는 것이 성능 향상에 도움이 된다. 32개의 Thread들 중에서 1개라도 서로 다른 branch 결과를 가지면, 다른 1개를 수행하기 위하여 나머지 31개의 Thread가 멈춰야한다.
SM에서 수행되는 단위는 warp이며, 일반적으로 32개의 Thread로 이뤄져있다. 이 warp 단위로 실행이 되는데, 큰 latency를 가지는 동작이 발생하면 기다리지 않고 그 동안 다른 warp를 수행한다. 이를 hardware 적으로 수행하여 hardware context switch라한다. SM 내부에는 빠른 context switch를 수행하기 위하여 필요한 데이터를 미리 SM 내부에 저장하고 있다.
GPU는 이러한 SM이 무수히 많이 존재한다. 각 SM은 각자가 사용하는 Memory/Cache가 존재하며, SM간의 공유하는 Memory/Cache도 존재한다.
'IT_Study > CS_Study' 카테고리의 다른 글
[Parallel Computing] (19) Register Allocation (0) | 2024.05.26 |
---|---|
[Parallel Computing] (18) OpenCL (0) | 2024.05.26 |
[Parallel Computing] (17) Memory Consistency (0) | 2024.05.25 |
[Parallel Computing] (16) Tiling for Matrix Multiply (0) | 2024.05.25 |
[Parallel Computing] (15) Cache Coherence (0) | 2024.05.25 |
댓글