떠오르는 생각을 정리하는 공간

[001] GPU에 대한 간략한 설명 본문

개인 공부/정리

[001] GPU에 대한 간략한 설명

바이너리 마중물 2016. 5. 23. 22:01

[출처 : www.nvidia.com]


  A graphics processing unit (GPU), also occasionally called visual processing unit (VPU), is a specialized electronic circuit designed to rapidly manipulate and alter memory to accelerate the creation of images in a frame buffer intended for output to a display. [Wikipedia]


  GPU에 대한 기술적인 내용은 없지만 발전 과정의 흐름을 통해 GPU에 대해 간략하게 알아보겠습니다. 설명은 GPU 생산 업체 중 GeForce 시리즈로 유명한 NVIDIA의 역사를 통해 GPU의 발전 과정을 설명드리겠습니다.


  초기 컴퓨터 분야에서는 GUI를 구현하기 위해 VGA (Video Graphic Array)를 이용했습니다. 하지만 기술에 대한 요구치가 증가하면서 실시간으로 고해상도 3D 영상이나 복잡한 이미지 처리가 필요해졌고, VGA를 대체하는 GPU가 개발 되었습니다. GPU가 처음 등장했을 때는 fixed function pipeline으로 동작하였지만 시간이 지나면서 micro-coded processor, configurable processor, programmable processor으로 개념이 변화했고, 최근에는 scalable parallel processor로 널리 사용되고 있습니다. 이를 이용해 개발자는 GPU의 병렬 처리를 통해 빠른 시간에 복잡한 알고리즘을 처리할 수 있게 되었습니다.


  최초의 GPU는 1999년에 출시한 GeForce 256입니다. 이는 단순히 pixel의 lighting과 color 편집을 위해 복잡한 floating point 연산에 특화된 HW 가속기로 개발되었습니다. 그래서 당시에는 floating point 연산의 정확성을 높이는 것이 주요 목적이었습니다. 2001년 OpenGL과 DirectX를 이용한 programmable shader가 등장하면서 최초의 vertex processor인 GeForce 3가 등장했습니다.

  그 후, parallel programming 구현을 위한 Cg language가 개발 되었고, 단일 pixel에 대한 명령을 통해 다수 pixel을 독립적으로 처리할 수 있게 되었습니다. 이러한 병렬 처리는 영상 처리 뿐만 아니라 일반적인 컴퓨팅 연산에도 적용 되면서 GPGPU (General Purpose GPU)라는 개념이 등장한 시기입니다. 하지만 당시 프로그래머에게 Cg language를 이용해 범용적인 작업을 구현하는 것은 어려운 일이었습니다.

  위에서 언급한 문제를 해결하는 CUDA parallel computing model이 2006년 GeForce 8800과 함께 등장하였습니다. CUDA를 이용해 C language로 작성한 프로그램도 최소한의 독립적인 thread로 분리해 GPU에서 병렬적으로 동작이 가능하게 되었습니다. 이 때부터 GPU의 개념이 영상 처리를 위한 HW 가속기에서 범용적인 연산을 할 수 있는 processor로 바뀌게 되었습니다.


 간단한 개념을 설명하기 위해 NVIDIA의 kepler block diagram을 이용했습니다.


  GPU는 host (CPU)와 PCI-Express 같은 고속 IO bus를 이용해 통신합니다. 또한 GPU 전용 memory가 존재하며, 동시에 여러 data를 처리하기 위해 high data bandwidth로 연결되어 있습니다. NVIDIA GPU의 경우 512-bit로 구성되어 있는데, 이를 통해 순차적으로 32-bit word 16개를 동시에 처리할 수 있습니다. 하지만 개발자가 필요한 data 16개를 임의로 선택할 수 없으므로 필요한 data가 연속적이지 않는 경우 bandwidth penalty가 발생하는 단점이 있습니다.


  또한 GPU는 CPU와 다르게 수 백~수 천개의 core가 존재합니다. GPU 관련 연구를 보면 어디서는 CUDA processor라고 부르고, 어디서는 Stream processor로 부르는 것을 볼 수 있습니다. 둘 다 비슷한 개념을 나타내며, 회사에 따라 전자는 NVIDIA에서 후자는 ATI에서 사용하는 용어입니다. 그렇다고 둘의 기술이 똑같은 것은 아니고 CPU의 할 일을 분담하려는 목적이 같다고 할 수 있습니다. 컴퓨터 구조를 공부하신 분들은 아시겠지만 DRAM access latency를 줄이기 위해 memory hierarchy가 필요하다고 배웠을 것입니다. 하지만 GPU의 경우 한 번 사용한 data를 반복적으로 사용하는 빈도가 적기 때문에 memory hierarchy가 성능에 미치는 영향이 적습니다. 그래서 GPU에서는 core 개수보다 많은 thread를 동시에 fetch해서 해결하고 있습니다.

'개인 공부 > 정리' 카테고리의 다른 글

[003] clock skew  (0) 2016.08.16
[002] 폴링, 인터럽트, DMA  (1) 2016.05.29
[000] 전공 공부 정리를 위한 게시판  (0) 2016.05.23
Comments