[GPGPU Series 2] General Purpose on GPUs

시작이 중요하다고 Index 다음으로 첫 글을 작성하였다. CUDA가 GPU에서 동작하는 순서를 알기 전에 General Purpose on GPU (GPGPU) 개념을 먼저 설명할 필요가 있다. GPGPU라는 개념이 생긴 이유는 개인적인 견해가 많이 들어간 부분이다. 2010년도 초반부터 공부했기 때문에 GPU 또는 GPGPU의 많은 과거사를 정확하게 알고 있지는 않다.

우선 가장 먼저 GPU의 긴 역사 중 중요한 몇 가지 사실을 알 필요가 있다. GPU를 간단히 설명하면 Image를 만들어서 모니터에 Display 해주는 장치이다. 처음에는 GPU라는 Device가 따로 존재하지는 않았던 것으로 알고 있다. 단순히 CPU가 색상을 모니터에 Display 해주는 형태였다. 조금 더 정확하게 설명하면 단순히 저장된 값을 출력하는 정도의 수준이었다. 하지만 GAME 등의 발전으로 유저의 Input에 따라 Image가 변하고 모니터에 Display 되는 결과가 실시간으로 변하게 된다. 변하는 Image를 효과적으로 계산하기 위해서 Graphics Processing Unit (GPU) 라는 Device가 만들어진다. 초창기 GPU의 경우 Fixed Function Unit으로 구성되어서 정해진 연산을 순서대로 계산하는 단순한 장치였다. Fixed Function Unit으로 구성된 GPU의 경우 항상 정해진 순서대로 계산을 하므로 새로운 그래픽 기법 (예를 들어 빛을 계산하는 방법)을 적용하기 위해서는 GPU를 다시 제작해야 한다. 이러한 단점을 보완하여 요즘 출시되는 GPU가 현재(2018년 기준) 우리가 구매하는 GPU이다. 요즘 출시되는 GPU는 Fixed Function Unit과 Programmable Core (Shader)를 모두 가진 형태이다. GPU에 내장된 Programmable Core 부분은 프로그래머(유저)가 작성한 코드를 실행하는 부분이다. General Purpose on GPU는 프로그래머가 작성한 코드가 GPU의 Programmable Core에서 실행(계산)되는 것을 의미한다. 조금 더 정확히 말하면 Graphic Application이 아닌 다른 Application을 GPU에서 실행하면 모두 General Purpose on GPU가 되는 것이다.

그럼 도대체 왜 이렇게 GPGPU라는 개념이 유명해졌냐고 물어보면 GPU를 사용하여 획기적으로 성능 개선이 되는 종류의 문제들을 많이 찾았기 때문이라고 답할 수 있을 것 같다 (정말 유명하냐고 물어보면 나는 그렇다고 답할 것 같다). 특히 지난 몇 년간 인터넷, TV 뉴스에서 자주 등장하는 머신러닝이 대표적인 애플리케이션 중에 하나이다. 머신러닝이란 개념은 1960년 정도부터 존재했으나, 실제로 연산을 할 수 있는 정도의 성능이 나오지 않아서 이론적으로만 존재하던 개념이였다. 하지만, GPU를 만나면서 획기적으로 발전하게 된다. 이제는 GPU를 넘어서 머신러닝 전용 Accelerator (TPU)가  탄생하였고 GPU를 밀어내고 있는 형태이다 (출처 1). 하지만, 아직도 많은 분야에서 GPU를 사용하고 있다.

그럼 다음은 도대체 왜 GPU를 사용하면 머신러닝등과 같은 다양한 애플리케이션의 성능이 향상되는지에 대한 답을 할 차례이다. 이는 GPU의 구조를 알면 쉽게 답을 찾을 수 있다. GPU 간단한 구조에 대해 설명을 하기 전에 Graphics Pipeline에 대한 설명이 필요하다.

그림 1: Graphics Pipeline on OpenGL4 (출처 2)

그림 1은 OpenGL 4 기준의 Graphics Pipeline을 보여준다. 그림에 노란색상으로 표시된 부분은 Fixed Function Unit에서 실행되는 부분이고,  파란색상으로 표시된 부분은 Programmable 가능한 Stage로 Programmable Core에서 실행되는 부분이다 (Programmable Core라는 단어가 조금 이상하다. 정확히 말하면 프로그래머가 작성한 코드가 실행되는 부분이다). Fixed Function Unit은 정확히 어떤 연산을 수행하는지 잘 모른다. 그리고 GPGPU 개념에서는 크게 중요한 부분이 아니라고 판단하기에 무시하겠다. Programmable 가능한 Stage (파란색상)는 GPU의 Streaming Multiprocessor라는 GPU Core에서 연산을 수행한다 (자세한 설명은 다음에 진행할 예정이다). 여기서 주목해야 할 부분은 Programmable 가능한 Stage는 아주 높은 병렬성을 가진다는 것이다. 예를 들어 Fragment Shader Stage는 Image의 각 Pixel 색상을 계산하는 부분이다. 최근 우리가 사용하는 모니터는 대부분 1920 x 1080 (1080p) 개의 Pixel로 구성되어 있다. 추가로 대부분 60 Frame Per Second (FPS)를 지원한다. 그럼 초당 1920 x 1080 x 60개의 Pixel 연산이 필요하다 (물론 게임이 30FPS를 지원하면 이보다 적을 수도 있다). 앞에서 설명한 수치는 정말 최소한의 수치이다. 한 Pixel에 여러 개의 색상을 계산하여 합치거나, Depth Test 등으로 인해서 한 Pixel 값을 여러 번 계산되는 경우를 가정하면 실제로는 정말 어마어마하게 많은 Pixel 연산이 필요하다. 많은 Pixel 연산을 수행하기 위해서 GPU는 아주 많은 연산기 (ALU)를 내장하고 있다. 대부분의 Pixel 연산은 서로 독립적이기 때문에 병렬적으로 수행된다 (실제로는 완전 독립은 아니다. Blending, Anti-Aligning과 같이 Value를 Share 하는 경우도 있다. 하지만 대부분의 연산이 독립적이고, Blending과 같은 연산은 Fixed Function Unit에서 계산한다).

그림 2는 Image 연산 중에 하나의 예제를 보여준다. 그림2는 특정 Image를 Loading 하여 밝기값을 20 추가하면 Image를 변경하는 연산의 수행하는 순서를 보여준다. 그림에서 보여주듯이 Image는 Pixel들로 구성되어 있으며, Pixel들의 색은 8 Bit 값으로 표시할 수 있다고 가정하였다. Pixel 색상 값에 20을 추가하여 전체적인 Image를 밝게 만들기 위해 GPU의 아주 많은 ALU를 사용하여 더하기 (Addition) 연산을 수행한다. 최종 이미지는 기존 Input Image보다 밝은 값으로 변경된 Image가 된다. 그림 2는 GPU를 사용하여 연산하는 부분 중 아주 일부분이다. 하지만 많은 연산이 그림 2의 예제와 같이 높은 병렬성을 가진다.

그림 2: GPU Pixel 연산 예제 (아이유 사진 출처 3)

그림 2가 GPGPU 개념이 생겨나게된 핵심이다. 미친(똑똑한) 프로그래머들이 위의 Pixel 연산과 같이 서로 Dependency가 존재하지 않으면서 많은 연산이 필요한 애플리케이션을 GPU를 사용하여 성능을 개선하기 시작한다. 그리고 미친 프로그래머들 덕분에 병렬성이 높은 애플리케이션들의 성능이 대폭 향상되기 시작한다. 병렬성이 좋은 애프리케이션을 GPU를 사용하여 연산을 수행하면 기존 CPU에서 보다 100~1000배씩 빠른 성능을 보인다. 2010년 초반에는 GPU를 사용하여 병렬성이 높은 특정 애플리케이션들을 100배 이상 빠르게 계산하였다는 논문들이 나오기 시작한다. 그리고 이세돌과 경기를 했던 알파고는 GPU를 사용하여 머신러닝 연산을 수행하였다 (출처 4, 5). 이와 더불어 병렬성이 좋은 Coin Mining 연산도 GPU를 사용한다 (덕분에 GPU 가격이 폭등하게 된다).

하지만, 역시나 모든 애플리케이션이 GPU를 사용한다고 성능이 좋아지지 않는다. 특정 애플리케이션의 경우 GPU를 사용하면 CPU를 사용하는 것 보다 느려지는 경우도 빈번히 발생한다. 뭣도 모르는 양반들이 그냥 GPU를 사용하면 무조건 빨라지는 것 아니냐 이런 말도 안 되는 소리를 한다. CPU/GPU의 특성을 잘 알면 CPU에 적합한 애플리케이션과 GPU에 적합한 애플리케이션을 나눌 수 있다. 오늘은 간단하게 GPGPU라는 개념이 생겨난 이유를 정리해보았다. 다음부터는 GPU 구조부터 GPGPU 애플리케이션 구조에 대해 한번 알아보겠다.

출처

  1. In-Datacenter Performance Analysis of a Tensor Processing Unit
  2. https://www.3dgep.com/introduction-to-opengl-and-glsl/
  3. http://m.entermedia.co.kr/news_view.html?idx=4551#cb
  4. https://www.economist.com/science-and-technology/2016/03/12/showdown
  5. https://en.wikipedia.org/wiki/AlphaGo

 

Leave a Comment