프로그래밍/GPU Computing(CUDA)

GPU Programming (왜 GPU를 사용하는가)

내꿈은자동화 2017. 2. 18. 23:30

이번 글에서는 '왜' GPU 를 이용하여 프로그래밍을 하는 것이 좋은가에 대해 알아보겠다. (GPU : Graphic Processing Unit)

공을 줍는 예를 들어 GPU 의 개념을 설명하겠다.


<그림 1> 운동장에서 공을 줍는 법


<그림 1> 은 운동장에 있는 공을 사람(A)이 줍는 것을 보여준다. A가 공을 한번에 최대 1개 옮길 수 있고 공을 한번 옮기는데 걸리는 시간이 1초라고 할 때 이 사람은 총 9초를 소모하게 된다.

만약 A가 공을 줍는데 걸리는 시간을 단축하고자 한다면 어떤 방식을 써야할까?

쉽게 생각할 수 있는 방법이 '더 빨리' 공을 가져오는 것이다. 공을 옮기는데 0.5초가 걸린다면 총 4.5초를 소모하게 된다. 그리고 0.3초가 걸린다면 총 2.7초를 소모하게 된다. 하지만 이런 경우 쉽게 생각할 수 있는 것이 '한계' 이다. 우리는 미드 플래시의 주인공이 아니기 때문에 최대한 빠르게 할 때 그 '속도'는 일정 이상 올리지 못한다.

다른 방법으로 '친구'를 데려오는 것이 있다. 'A만 있었는데 갑자기 무슨 친구를 데려와서 일을하냐, 반칙 아니냐' 라고 할 수 있다. 불만에 대해 잠시 접어두고 설명해보면 A와 그의 친구 8명이 공을 옮긴다면 1초만에 공을 옮길 수 있을 것이다. 앞의 내용과 비교해보면 9개의 공을 옮길 때 A가 친구를 데려왔을 때와 같은 속도를 맞추려면 A혼자서는 약 10배 더 빨리 옮겨야 한다.


두 방법을 지금부터 알아볼 GPU 로 이야기해보자.

첫 번째 경우는 고전적인 속도향상 방법으로 CPU(Central Processing Unit, 중앙처리장치)의 경우에 해당한다.

<그림 2> 연도별 CPU의 변화

(https://www.extremetech.com/computing/116561-the-death-of-cpu-scaling-from-one-core-to-many-and-why-were-still-stuck)


20세기 후반에 비해 CPU의 Clock Speed는 많이 증가했으나 2005년 이후 성장이 멈췄다. 이에 대해 사람들은 CPU의 속도가 '한계에 봉착했다' 라는 표현을 쓴다.

예시에서와 마찬가지로 A가 공을 아무리 빨리 옮긴다 한들 그 속도의 상한선은 정해져있다고 보면 된다. (웃긴 비교가 될지 모르지만 트렌지스터의 수가 A의 근력과 지구력일 때 그게 아무리 높아진다 한들 특정 속도 이상 달리기(성능을 내기) 힘들다는 것이다.)


여기까지가 첫 번째 경우 (CPU)에 대한 것이고 다음으로 두 번째 경우에 대해 살펴보자.

A가 친구를 데려왔던 경우인데, 이것을 보고 아까 '반칙 아니냐' 라는 표현을 사용했었다. 사실 매우 반칙같은 이야기였지만 그 '반칙'을 실제로 GPU에서 사용한다.

컴퓨터에서는 코어(Core) 하나가 한 개의 작업을 수행한다. (A와 그의 친구들도 한 개의 코어라고 생각하면 된다.)

CPU 는 보통 쿼드코어, 옥타코어를 사용하지만 GPU의 경우 2016년 출시한 Pascal Architecture 에서 저가형 모델이 1280개의 코어를 사용한다. 아까 말했던 반칙같은 상황이 현실에서 일어나는 것이다.


 

 CPU

 GPU

 Core

 4 

 1280

 Clock Speed (Ghz)

 3.5

 1.7

 Multiply

 14 

 2176 

<표 1> CPU vs GPU


위에서 말한 상황을 표 1. 에 정리해 놓았다. (이 표에서 처럼 단순 곱연산으로 속도가 측정되지는 않는다.)

과거(2006)에는 CPU와 GPU를 2 마리의 황소와 1024 마리의 닭으로 표현했다. 그 당시에는 GPU의 Clock Speed가 매우 낮았고 (1Ghz 미만) 프로그래밍이 매우 힘들었기 때문이다. 하지만 표에서 볼 수 있듯이 GPU 의 Clock Speed는 비약적으로 발전했고, 프로그래밍 방법 또한 많이 향상되었다.



처음 글에 담으려고 했던 내용에서 조금 벗어나는 경향이 있는 것 같아서 여기서 복습을 한번 하고 넘어가겠다.


지금까지 '공줍기' 와 CPU, GPU 를 이용해서 혼자 작업할 때 효율의 상한선이 존재한다는 것과 '동시작업' 으로 인한 효율 향상을 살펴 보았다.


지금부터는 GPU의 장점에 대해 컴퓨터의 관점에서 설명하겠다.

<그림 3> CPU (좌) 와 GPU (우) 의 구조


<그림 3> 을 살펴보자. CPU와 GPU의 차이는 CPU에는 제어장치가 존재하는 대신 산술논리연산장치가 한 개 뿐이다. <그림 3> 에서 알 수 있는 것은 CPU 가 산술논리연산에서 GPU보다 안좋다는 것이다. (GPU에는 제어장치가 없는데 어떻게 연산을 하냐는 질문을 할 수 있는데 GPU에게 명령을 내리는 것은 CPU이다. 이는 뒤에 설명할 것이다.)

GPU가 연산에 더 최적화 되어있긴하지만 CPU와 달리 여러 ALU를 동시에 작동시켜야 하기 때문에 복잡한 연산을 하지 못한다.


위 내용을 요약하면 아래와 같다.

CPU - 복잡한 연산, 단일 성능이 높음 (Clock Speed)

GPU - 단순한 연산, 단일 성능이 낮음, ALU 동시에 구동 가능, 프로그래밍에 제한이 있음


GPU 를 왜 사용하는가에 대한 설명은 여기까지이다. (항상 그랬듯이 글이 용두사미라 참 슬프다.)




이것을 좀 더 어려운 개념을 더해서 설명하고 싶기 때문에 밑에 글을 조금 더 추가한다.

추가적인 내용이기 때문에 필요하지 않은 사람은 읽지 않아도 무방하다.


컴퓨터 하드웨어는 전력을 얼마나 소비하는지가 중요하다.

CPU 는 전력 효율을 높이기 위해 latency(지연) 를 줄인다.

이는 특정 연산이나 제어를 하고나서 다음번 연산이나 제어를 할 때까지의 시간을 줄여 빠른 속도로 일을 처리한다는 것이다.

이와 달리 GPU 는 전력 효율을 높이기 위해 throughput(jobs/hour) 을 늘린다.

이는 한 번에 얼마나 많은 양을 수행할 수 있냐는 것으로 GPU의 병렬연산(앞에서 동시연산이라 말했던 것과 같은 의미) 능력을 뜻한다.

latency 와 throughput 에 대해서는 <그림 4> 를 잠고하자.

<그림 4> Latency, Throughput


<그림 4> 는 사람이 공을 가져오는 것이다.

A는 한 번에 1개의 공을 옮길 수 있고 1초에 한번 작업을 할 수 있다. (Latency : 1, Throughput : 1)

B는 한 번에 4개의 공을 옮길 수 있고 2초에 한번 작업을 할 수 있다. (Latency : 2, Throughput : 2)

(버스와 스포츠가 라고 생각할 수도 있다.)


전력 효율을 높이기 위해서 CPU 는 점점 latency 를 줄여가고 GPU 는 throughput 을 늘려간다. 



<참고 문헌>


<그림>

2. Extremetech (https://www.extremetech.com/computing/116561-the-death-of-cpu-scaling-from-one-core-to-many-and-why-were-still-stuck)


<표>