Kim Seon Deok
[General Purpose GPU] ch1. Introduction 본문
*General - Purpose Graphics Processor Architecture의 chapter 1를 읽고 정리한 내용입니다.
1.1 Landscape of computation accelerators
- transistor 크기의 감소
- hardware architecture의 향상
- compiler technology와 algorithm의 향상
과 함께 computing system은 발전해왔다.
Denarrd scailing의 법칙이 들어맞지 않게되면서 device의 크기가 점점 더 작아짐에 따라 clock frequency가 더 느려지게 되었다. 따라서 energy efficiency 향상이 computer architecture 연구에서의 주요한 motivation이 되었다.
Hardware specialization을 활용하면 energy utilization을 500% 까지 향상시킬 수 있다.
- Vector hardware로 넘어오게 되면서 instruction processing의 overhead를 제거함으로써 10% 정도 energy utilization을 향상시킬 수 있다.
- large memory array에 대한 access를 피함으로써 여러 arithmetic operation을 수행하는 복잡한 연산을 도입해 data movement를 최소화함으로써 energy utilization을 향상시킬 수 있다.
computer architect는 specialize된 hardware를 사용함으로써 얻을 수 있는 utilization 항상과 프로그램을 지원하기 위한 flexibility사이에서 균형을 맞추어 나가야 한다.
앞으로 machine learning이 computing hardware resource에 매우 큰 부분을 차지하겠지만, 전통적인 방식의 programming language로 작성된 소프트웨어로 표현된 computation을 효율적으로 지원해야 한다.
GPU는 machine learning 이외에도 Turing Complete programming model을 지원한다.
* Turing Complete
충분한 시간과 memory가 주어진다면, 어떠한 computation이든 실행될 수 있다는 것
special - purpose accelerator에 비해 modern GPU는 flexible하다. 이러한 특성을 이용해서 많은 supercomputer에서 GPU가 포함되어 사용되고 있다. GPU는 세대를 거듭하며 programming model의 flexiblity와 energy utilization를 향상시키면서
개선되고 있다.
1.2 GPU hardware basic
현재 computing system에서 GPU는 stand-alone computing device가 아니다.
GPU는 CPU와 single chip에서 결합되거나 CPU가 포함된 system에 GPU만 포함된 add in card를 사용해 이용된다.
CPU는 GPU에서의 computation을 시작시키고 GPU로 data transfer를 담당한다.
CPU와 GPU의 역할이 division 된 이유는 computation의 시작과 끝에서 I/O device에 대한 access가 필요하기 때문이다.
I/O decice에 access하고 operating service를 제공하는 데 사용되는 소프트웨어는 massive parallelism과 같은 기능이 부족하다. 따라서 GPU에서 이를 실행하기에는 적합하지 않기 때문에 CPU와 GPU간의 interaction이 고려되어야 한다.
위의 Figure에서, 왼쪽은 Discrete GPU setup이며, 오른쪽은 Integrated GPU setup의 모습이다.
Discrete GPU setup
- CPU와 GPU 간 bus connecting (= PCIe)을 사용하여 연결된다.
- CPU와 GPU 간의 memory가 분리되어 있다.
CPU -> system memory -> DDR
GPU -> Graphics memory = device memory -> GDDR
CPU DRAM은 low latency access에 최적화 되어있는 반면 GPU DRAM은 high throughput에 최적화 되어 있다.
Integrated GPU setup
- single DRAM memory를 사용해 CPU와 GPU 간 memory를 공유한다. -> shared DRAM memory -> LPDDR
* unified memory
CPU와 GPU 양쪽에서 virtual memory 를 활용하는 방식이다. CPU와 GPU가 동일한 chip에 통합되어 있고 동일한 memory를 share하는 system에서는 CPU memory에서 GPU memory로 memory 복사가 필요하지 않다.
이 때 CPU와 GPU가 cache를 사용하게 되는데, 이 때 일부는 discrete할 수 있기 때문에 cache-coherent 문제가 발생할 수 있다.
GPU computing application은 CPU에서 실행을 시작한다.
application의 CPU에서 실행되는 코드 부분은 data structure를 allocate하고 initialize한 다음 CPU memory로부터 GPU memory로 data를 transfer한다.
GPU에서 computation을 시작하기 전에, GPU computing application은 GPU에서 실행할 코드 부분을 지정한다. 이 코드 부분을 일반적으로 kernel이라 한다.
동시에 GPU computing application의 CPU에서 실행되는 코드 부분은 실행할 thread 갯수와 thread가 input data를 어디에서 찾아야 하는지를 지정한다. 실행할 kernel, thread 갯수, 및 data 위치는 CPU에서 실행되는 driver를 통해 GPU로 전달된다. 이 driver는 정보를 해석하고 GPU에서 access 가능한 memory에 배치한다. 이 CPU의 특정 driver의 도움을 받아서 GPU에서 computation이 실행된다.
GPU Core
GPU는 많은 수의 core로 이루어져 있다. 이 코어를 NVIDIA에서는 streaming multiprocessor(SM)라 하며 AMD에서는 compute unit이라 일컫는다. 각 GPU core는 GPU에서 실행되는 application의 kernel에 해당하는 부분을 SIMT 방식으로 실행한다. GPU의 core 하나는 일반적으로 약 1000개의 thread를 실행할 수 있다. single core에서 실행되는 thread는 scratchpad memory(=shared memory)를 통해 communicate하고, fast barrier operation을 통해 synchronize될 수 있다.
각 core는 일반적으로 L1 instruction cache와 L1 data cache를 포함하며 이 L1 cache는 memory system의 lower-level로 transfer되는 traffic 양을 줄이기 위해 bandwidth filter 역할을 한다.
single core에서 실행되는 많은 수의 thread들은 찾고자 하는 data가 L1 cache에 없을 때 memory access latency를 hide하기 위해 사용된다.
Interconnection Network
high computation throughput을 달성하기 위해서는 high memory bandwidth와 함께 high computational throughput을 유지해야 한다. 이를 위해선 memory system에 parallelism이 필요하다.
GPU에서 parallelism은 multiple memory channel을 통해 제공된다. 각 memory channel에는 memory partition의 일부에 해당하는 last-level cache가 연결되어 있다. GPU core와 memory partition은 crossbar와 같은 on-chip interconnection network를 통해 연결된다.
GPU는 die area를 arithmetic logic unit에 많이 할당하고 control login에 적게 할당한다.
그렇기 때문에 out-of-order방식의 CPU에 비해 highly parallelize된 workload를 실행 했을 때 performance per second측면에서 더욱 향상된 성능을 얻을 수 있다.
위 그래프는 thread가 data를 공유하지 않고, off-chip memory bandwidth가 infinite하다는 가정(=simple cache model) 하에
thread 갯수가 변하면서 performance가 어떻게 변화하는 지를 보여주는 그래프이다.
- large cache 는 적은 수의 thread를 공유하고 있지만, thread의 갯수가 점점 증가하게 되면 performance도 점점 증가한다.(MC Region = muticore region)
- 하지만 cache가 entire working set을 hold할 수 없을 정도로 thread의 갯수가 일정 지점까지 증가하게 되면 performance가 감소하게 된다. (Valley reigion)
- 여기서 thread 갯수가 더 증가하면 multithreading이 off-chip latency를 hide하는 방식에 의해 performance가 증가하게 된다. (MT Region = multithread region)
따라서 GPU는 multithreading을 활용해 빈번하게 발생하는 cache miss를 tolerate하도록 design되었다.
또한 large memory structure에 access하는 것은 compuation만큼 혹은 그 이상의 energy를 소비할 수 있다.
(초기 GPU의 발전 과정을 옮겨 놓은 것입니다.)
1.3 A brief history of GPUs
GPU는 초기 video game의 real-time redering에 주로 사용되었지만, 점점 non-graphic computing을 지원하면서 performance와 energy efficiency가 증가했다.
computer graphics는 1960년대 Ivan Sutherland의 Sketchpad 프로젝트로 출현했다.
computer graphics는 초기에 애니메션을 위한 offline rendering과 함께 영화 산업에 핵심적인 부분을차지했고, video game에서 사용할 real-time rendering technique 발전에도 기여했다. 초기 video card는 1981년 Monochrome Display Adapter(MDA)로 시작했고 이 당시에는 text만 지원했다. 이후 video care에서는 2D 및 3D acceleration이 발전하게 되었다.
3D accelerator는 video game 뿐만 아니라 computer-aid design에도 이용되었다.
2001년 NVIDIA에서 GeForce 3을 출시하면서 vertex shader 및 fixel shader를 통해 GPU의 programability을 보여주었다.
이후 빠르게 초기 GPU 아키텍쳐를 이용해 linear algebra 연산을 구현하는 방법이 연구되면서 matrix data를 texture로 mapping하고 shader를 적용할 수 있게 되면서 graphic을 알 필요 없이 GPU에 general-purpose computing을 적용하는 작업이 빠르게 진행되었다.
General - purpose computing이 최초로 적용된 제품은 NVIDIA의 GeForce 8 시리즈였다. 이는 임의의 memory address에서 shader로부터 write를 할 수 있게 하며 off-chip bandwidth를 제한하기 위한 scratchpad memory와 같은 기술을 보여주었다. 다음으로 NVIDIA의 Fermi 아키텍쳐에서 read-write data caching이 가능해졌다.
CPU와 GPU를 동일한 die에 통합한 AMD의 fusion 아키텍쳐를 거쳐 최근에는 NVIDIA의 Volta 아키텍쳐를 통해 tensor core가 추가되어 machine learning의 가속이 더욱 빨라지게 되었다.
'General Purpose GPU' 카테고리의 다른 글
[General Purpose GPU] ch3.4 Research directions on branch divergence(1) (0) | 2024.01.15 |
---|---|
[General Purpose GPU] ch3.2 TWO - LOOP APPROXIMATION ~ ch3.3 THREE-LOOP APPROXIM (0) | 2024.01.07 |
[General Purpose GPU] ch3.1 ONE - LOOP APPROXIMATION (0) | 2024.01.02 |
[General Purpose GPU] ch2. Programming model (0) | 2023.12.28 |